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

标签 php interface abstract-class

我的代码是否有问题或者我真的无法在抽象类中实现接口(interface)?我的代码无法运行并且 PHP 抛出错误:

Fatal error: Class 'Blah' not found

我的代码:

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,我太鲁莽了。你的答案是正确的,它对我帮助很大 - 我理解接口(interface)x抽象类,你的建议将来会非常有帮助(我对你的+1仍然存在),但我在另一台机器上尝试过。今天,当我上类并采纳您的建议时,错误仍然出现。

我想向您提供更多信息。首先,我删除了“abstract public function Fun();”根据你的建议从我的抽象课中。第二件事是我的接口(interface)和抽象类位于一个 PHP 文件中,而 Koko 类位于另一个 PHP 文件中(如果我将 Koko 类移至与接口(interface)和抽象类相同的文件中,则不会引发错误)。

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

最佳答案

无需在已在其实现的接口(interface)中声明的抽象类中声明抽象函数 - 您会收到错误(在 PHP 5.2 中,看起来 PHP 5.3 的处理方式有点不同):

Can't inherit abstract function IBlah::Fun() (previously declared abstract in Blah)

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

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.3Koko 对象将被视为 IBlah 对象。这很容易检查:

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

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

关于php - 抽象类无法实现? (PHP 5.2.9),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22762117/

相关文章:

map - 将 map[interface {}]interface {} 转换为 map[string]string

c# - 基于抽象实体的预加载嵌套导航问题(EF CTP5)

php - twilio '未知上下文帐户

php - 从 SAML 响应 (XML) 中检索属性和名称 ID

java - 在 Java 类中实现的具有相同方法签名的两个接口(interface)

c++ - 从抽象基类调用派生类的c'tor

c++ - 有关 "cannot instantiate abstract class"的更多信息

php - 如何获取php mysql中某个ID的所有值?

php - Laravel - 如何在两个表的内部循环但不连接表

pointers - 如何在 Go 中的指针到指针上键入选择接口(interface)?