Php 同一文件中的类定义会导致致命错误

Php 同一文件中的类定义会导致致命错误,php,class,Php,Class,我知道在PHP中可以定义一个类,而不管它在文件中的位置如何,都可以使用该类。例如,请看下面的代码: <?php //First case. No errors. class Second extends First{} class First{}; //Second case. Still nothing. abstract class B extends A{}; class C extends B{}; class A{}; //Fatal error! class C1 ex

我知道在PHP中可以定义一个类,而不管它在文件中的位置如何,都可以使用该类。例如,请看下面的代码:

<?php 

//First case. No errors.
class Second extends First{}
class First{};

//Second case. Still nothing.
abstract class B extends A{};
class C extends B{};
class A{};

//Fatal error!
class C1 extends B1 { };
abstract class B1 extends A1{ };
class A1 { };
?>

前两种情况可以,但不是最后一种。为什么?有什么规定吗?


附则;我使用的是PHP 5.6.25、Apache 2.4、CentOS 6.7。

我找不到这方面的书面规则,但看到了以下结果:

<?php
//A1 Exists
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>";
//B1 Not exists
echo class_exists("B1")?"B1 Exists<br>":"B1 Not exists<br>";
//C1 Not exists
echo class_exists("C1")?"C1 Exists<br>":"C1 Not exists<br>";
class C1 extends B1 {};
class B1 extends A1{ };
class A1 { };
?>

我可以看出解释器可以前后查看父类,但是当您链接第三级继承时,它无法预测B1是否会存在

如果您这样做:

<?php
//A1 Exists
echo class_exists("A1")?"A1 Exists<br>":"A1 Not exists<br>";
//B1 Not exists
class B1 extends A1{ };
class A1 { };
?>


它说“好的,我以前没有看到A1类声明,但我看到它在前面。”

我很抱歉地说,但这不是真的,尽管它看起来是这样的:

我知道在PHP中可以定义一个类,而不管它在文件中的位置如何,都可以使用该类

让我们检查一下

注意: 类必须在使用之前定义!如果希望名为_Cart的类扩展类Cart,则必须首先定义类Cart。如果要基于名为\u cart的类创建另一个名为Yellow\u named\u cart的类,则必须首先定义named\u cart。简而言之:类的定义顺序很重要


B1级
?它在哪里?您必须有一个类来扩展它。可能是@PHPglue第14行的重复。@PHPglue 1。不要感到震惊。2.我在问为什么前两个可以,而第三个不行。@PHPglue我用autoloader加载我的类。我只是想知道它为什么会这样。我验证了PHP7.0中仍然存在这个“问题”,我想说你的解释是正确的。由于遗留原因,解析器似乎使用整个文件的标记化结果来“修补”不正确的声明顺序,但实际上只在一个直接的继承链中解析它们。因此,在多个场景中,它总是在3级或更高级别失败。但前两个是可以的。在定义类之前,我首先扩展了类