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

时间:2017-01-17 21:39:56

标签: 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 extends B1 { };
abstract class B1 extends A1{ };
class A1 { };
?>

前两种情况很好但不是最后一种情况。为什么?有规则吗?  Fatal Error

P.S;我使用的是PHP 5.6.25,Apache 2.4,CentOS 6.7。

2 个答案:

答案 0 :(得分:2)

我无法找到一条书面规则,但看到了这个结果:

<?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级声明,但我发现它已经超前了#。

答案 1 :(得分:1)

我很遗憾地说,但事实并非如此,即使看起来如此:

  

我知道在PHP中你可以定义一个类,无论它在文件中的位置如何,你都可以使用该类。

让我们检查documentation

  

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