【问题标题】:PHP: inherit from a class that implements an interfacePHP:从实现接口的类继承
【发布时间】:2018-05-28 11:42:50
【问题描述】:

我有两个文件,比如说 a.php 和 b.php:

a.php:

require 'b.php';
interface testInterface{}
class a implements testInterface{}

b.php:

class b extends a{}

当我运行 a.php 时,它会抛出这个致命错误:

致命错误:在第 2 行的 b.php 中找不到类 'a'

使其更有趣的两个考虑因素:

  • 如果我删除 a 类中的 implements 子句,一切正常。

  • 如果我将 b 类与 a 类放在同一个文件中,但不将其作为外部文件包含在内,一切正常。

我不明白为什么会抛出该错误,非常感谢任何帮助。

【问题讨论】:

  • 在定义class a之前,你需要b.php,它依赖于class a的定义。由于{原因},它碰巧在没有界面的情况下也能工作,但你不应该首先创建这个逻辑轮播。
  • 你也需要 a.php 吗?
  • 为什么定义父类的文件还要导入带有子类的文件?!父母不应该知道他们的孩子。 b.php 应该 require_once 'a.php' 并且你应该正在执行 b.php。
  • 学习使用自动加载
  • @deceze 我想从 a 实例化 b,但现在我意识到它不应该这样工作。谢谢。

标签: php php-internals


【解决方案1】:

编辑:如果其他人遇到这个问题,我只是偶然发现了这个答案,它在解释事情方面做得更好:Why can't you inherit from a not-yet-defined class which inherits from a not-yet-defined class?

这方面的单独文件方面实际上是无关紧要的 - 您可以通过简单地定义无序的类/接口来重现相同的行为。

我对 PHP 的内部结构知之甚少,无法说明为什么会发生这种情况,但如果不只是一个非常简单的继承结构,则需要按顺序定义类.

这行得通

<?php
class b extends a {}
class a {}

这不是:

<?php
class c extends b {}
class b extends a {}
class a {}

在实现接口时,您可能会引起类似的怪异,如您的问题:

作品:

<?php
interface testInterface {}
class b extends a implements testInterface {}
class a {}

不起作用:

<?php
interface testInterface {}
class b extends a {}
class a implements testInterface {}

简而言之:始终按照使用顺序声明您的接口、类和特征。 PHP 可能 能够为您解决问题,但不要依赖它(我怀疑不同的版本也会以微妙的不同方式表现)。几年前由 Taylor Otwell 发布的this question 也得出了相同的结论。

【讨论】:

    【解决方案2】:

    最后输入require 'b.php';class a 应该在class b 之前声明

    interface testInterface{}
    class a implements testInterface{}
    require 'b.php';
    

    【讨论】:

      【解决方案3】:

      在类 b 中,您正在继承类,并且在包含类 b 之后声明类 a。 PHP 从上到下运行。当它包含 b.php 时,它会尝试执行 b.php 中编写的代码,但此时未声明类 a。这就是它抛出致命错误并停止进一步执行的原因。

      在声明类 a 之后尝试包含 b.php -

      interface testInterface{}
      class a implements testInterface{}
      require 'b.php';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 2012-04-11
        • 2016-02-12
        • 1970-01-01
        相关资源
        最近更新 更多