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

抽象类无法实现?(PHP 5.2.9),php,interface,abstract-class,Php,Interface,Abstract Class,我的代码中是否有错误,或者我确实无法在抽象类中实现接口?我的代码不工作,PHP抛出错误: 致命错误:未找到类“Blah” 我的代码: interface IBlah { public function Fun(); } abstract class Blah implements IBlah { public function FunCommon() { /* CODE */ } abstract public function Fun(); } class Kok

我的代码中是否有错误,或者我确实无法在抽象类中实现接口?我的代码不工作,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

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

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

我试图打印已声明的接口-get_declared_interfaces(),以及已声明的类-get_declared_classes(),并打印出接口IBlah,但也没有打印出Koko。

当我将抽象类实现接口的声明更改为抽象类时(如上所述),Iblah、Blah和Koko都会被打印出来。

不需要在抽象类中声明一个抽象函数,而抽象类已经在它实现的接口中声明了——您会得到一个错误(在中,看起来对待它有点不同):

无法继承抽象函数IBlah::Fun()(以前声明 摘要(废话)

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

interface IBlah {
  public function Fun();
}

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

class Koko extends Blah {
  public function Fun() {}
}
…在和中都是有效代码,
Koko
对象将被视为
IBlah
对象。这很容易检查:

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

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

你能重现OP发布的错误吗?我不能。不,还有另一个错误:
不能继承抽象函数IBlah::Fun()(之前在Blah中声明了抽象)
是的,但OP提到它是PHP5.2-这就是为什么我选择了
codepad
)看起来像是在5.4中更改的(甚至是5.3,需要检查它).谢谢你,伙计。。这是有道理的。我明白了,没问题。你能展示一下这些文件是如何包含进来的吗?再次非常感谢你,我在这方面有点害羞。你又对了(如果可以,我再给你+1:-)。我的“require_once”调用在错误的文件中。这是因为我正在修改别人的代码,但我没有意识到这一点。谢谢你,祝你今天愉快:-)。