PHP:继承自实现接口的class

PHP: inherit from a class that implements an interface

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

a.php:

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

b.php:

class b extends a{}

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

Fatal error: Class 'a' not found in b.php on line 2

使它更有趣的两个注意事项:

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

最后放require 'b.php';class a 应该在 class b

之前声明
interface testInterface{}
class a implements testInterface{}
require 'b.php';

编辑:万一其他人遇到这个问题,我只是偶然发现了这个答案,它在解释事情方面做得更好:

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

我对 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 可能 能够为您解决问题,但不要依赖它(我怀疑不同的版本也会以微妙的不同方式表现)。在 this question 几年前由 Taylor Otwell 发表的所有人中也得出了同样的结论。

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

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

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