如何理解 PHP 手册中关键字 "extends" 中的 "类必须在使用前定义"?

3

我得到了两个 PHP 文件 a.php

<?php
class A extends B {}
class B{}

php a.php
>>>没有错误

b.php

<?php
class A extends B {}
class B extends C {}
class C{}

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

根据[php.net手册]

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

因此,请解释一下为什么a.php没有出现“致命错误”。


它的行为就像一个函数 :( - user1646111
@MarkBaker 它给出了与 OP 所述相同的错误。 - Konsole
1个回答

2
根据PHP继承文档Inheritence,如果没有使用自动加载,则必须在使用类之前定义它们。如果一个类扩展另一个类,则父类必须在子类结构之前声明。这个规则适用于继承其他类和接口的类。此示例对B和D类没有依赖关系。
<?php
 //This will work
 class A extends B {} //searches for class B in current document
 class B {}

 class C extends D{}
 class D{}

类B依赖于类C

<?php
 //This will not work
 class A extends B {} //searches for class B in current document but class B has dependencies
 class B extends C {}
 class C{}

对于 includes 和 require,您必须在使用文件中声明的函数/类之前包含文件。

另请参见自动加载


我仍然困惑于两个问题:1.为什么在没有显式调用__autoload函数的情况下它会被触发;2.如果这个函数在当前文件中查找类,为什么b.php不起作用?或者说这不会递归触发吗?非常感谢;) - Donald
在这种情况下,autoload函数没有被触发。您需要编写一些代码来自动加载php类。我没有尝试过,但使用autoload可能会解决这个问题。这里有一个关于在php中使用autoload的不错教程:http://www.codeforest.net/autoload-your-classes-in-php - Konsole
我刚刚尝试了一下...这里没有触发自动加载,而且这个函数也无法解决问题,因为加载文件本身会导致另一个未定义的问题。 - Donald
似乎关键在于双重依赖会导致问题,而单一依赖则不会。 - Donald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接