【问题标题】:Abstract class cannot be implemented? (PHP 5.2.9)抽象类无法实现? (PHP 5.2.9)
【发布时间】:2014-05-10 19:46:45
【问题描述】:

我的代码有问题还是我真的无法在抽象类中实现接口?我的代码不工作,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

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

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

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

【问题讨论】:

  • 我明白了,没问题。您能说明这些文件是如何包含的吗?
  • 再次非常感谢您,我在这方面有点害羞。你又是对的(如果可以的话,我会再次给你+1 :-))。我的“require_once”调用位于错误的文件中。这是因为我正在修改别人的代码,而我没有意识到这一点。谢谢你,祝你有美好的一天:-)。

标签: php interface abstract-class


【解决方案1】:

没有必要在已经在它实现的接口中声明的抽象类中声明抽象函数 - 你会得到一个错误(在 PHP 5.2 中,看起来 PHP 5.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.2PHP 5.3 中都是有效代码,Koko 对象将被视为IBlah 对象。这很容易检查:

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

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

【讨论】:

  • 您能否重现 OP 发布的那个错误?我做不到。
  • 不,还有一个错误:Can't inherit abstract function IBlah::Fun() (previously declared abstract in Blah)
  • 是的,但是 OP 提到它是 PHP 5.2 - 这就是我选择 codepad 的原因。 ) 看起来它在 5.4 中发生了变化(甚至 5.3,需要检查它)。
  • 谢谢伙计.. 有道理。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多