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
使它更有趣的两个注意事项:
如果我删除 class a
.
中的 implements
子句,一切正常
如果我将 class b
与 class a
放在同一个文件中,而不将其作为外部文件包含在内,一切正常.
我不明白为什么会抛出该错误,非常感谢任何帮助。
最后放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';
我有两个文件,比方说 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
使它更有趣的两个注意事项:
如果我删除 class
a
. 中的 如果我将 class
b
与 classa
放在同一个文件中,而不将其作为外部文件包含在内,一切正常.
implements
子句,一切正常
我不明白为什么会抛出该错误,非常感谢任何帮助。
最后放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';