抽象类无法实现?(PHP 5.2.9)


Abstract class cannot be implemented? (PHP 5.2.9)

我的代码有问题,或者我真的无法在抽象类中实现接口吗?我的代码不起作用,PHP 抛出错误:

致命错误:找不到类"Blah"

我的代码:

interface IBlah {
  public function Fun();
}
abstract class Blah implements IBlah {
  public function FunCommon() {
    /* CODE */
  }
  abstract public function Fun();
}
class Koko extends Blah {
  public function Fun() {
    /* CODE */
  }
}

当我将我的代码更改为以下内容时,现在可以工作了:

abstract class Blah {
  public function FunGeneral() {
    /* CODE */
  }
  abstract public function Fun();
}

我做错了什么吗?谢谢。

编辑: 2014-04-01<</strong>br/>

对不起@raina77ow,我太鲁莽了。你的答案是正确的,它对我有很大帮助 - 我理解接口 x 抽象类,你的建议在未来会很有帮助(我的 +1 仍然存在),但我在另一台机器上尝试过。今天,当我上班并应用您的建议时,错误仍然出现.

我想给你额外的信息。首先,我根据您的建议从我的抽象类中删除了"抽象公共函数 Fun();"。第二件事是我的接口和抽象类在一个PHP文件中,而类Koko在另一个文件中(如果我将类Koko移动到与接口和抽象类相同的文件中,则不会抛出错误).

我尝试打印声明的接口 - get_declared_interfaces() 和声明的类 - get_declared_classes(),接口 IBlah 被打印出来,但 Blah 也没有打印出来><。当我将抽象类实现接口的声明仅更改为抽象类(如上所述)时,Iblah 和 Blah 和 Koko 都被打印出来了。

没有必要在抽象类中声明一个抽象函数,该抽象类已经在它实现的接口中声明 - 你会得到一个错误(在 PHP 5.2 中,看起来 PHP 5.3 对待它的方式略有不同):

不能继承抽象函数 IBlah::Fun()(之前声明过) 摘要在废话)

解决方案:只需从抽象类中完全删除此声明 - 这...

interface IBlah {
  public function Fun();
}
abstract class Blah implements IBlah {
  public function FunCommon() {}
}
class Koko extends Blah {
  public function Fun() {}
}

。在 PHP 5.2 和 PHP 5.3 中都是有效的代码,Koko对象将被视为IBlah对象。这很容易检查:

function t(IBlah $blah) {
  var_dump($blah);
}
t(new Koko()); // object(Koko)#1 (0) {}