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

时间:2014-03-31 12:55:50

标签: php interface abstract-class

我的代码中有什么问题,或者我真的无法在抽象类中实现接口?我的代码无效,PHP抛出错误:

  

致命错误:Class' 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

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

我想向您提供更多信息。首先,我删除了#34;抽象公共函数Fun();"根据你的建议从我的抽象课。第二件事是我的接口和抽象类在一个PHP文件中,类Koko在另一个文件中(如果我将类Koko移动到与接口和抽象类相同的文件中,则不会抛出任何错误)。
/>

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

1 个答案:

答案 0 :(得分:3)

没有必要在抽象类中声明一个抽象函数,它已经在它实现的接口中声明了 - 你会得到一个错误(在PHP 5.2中,看起来像{ {3}}对待它有点不同):

  

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

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

interface IBlah {
  public function Fun();
}

abstract class Blah implements IBlah {
  public function FunCommon() {}
}

class Koko extends Blah {
  public function Fun() {}
}

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

function t(IBlah $blah) {
  var_dump($blah);
}

t(new Koko()); // object(Koko)#1 (0) {}