PHP类定义顺序

时间:2017-04-19 21:02:14

标签: php

我有一个用classpreloader创建的文件和一些自定义代码,它们将一堆类文件压缩成一个文件进行分发:

https://raw.githubusercontent.com/jnvsor/kint/1efd147f9831ade2e03921f7111ced07428556ab/build/kint.php

根据travis的说法,除了夜间以外,所有事情都失败了,但是出现了错误:

  

致命错误:第315行/home/travis/build/jnvsor/kint/build/kint.php中的未知类Kint_Renderer_Text

正如你在第315行看到的那样是一个class Kint_Renderer_Plain extends Kint_Renderer_Text,后面在第418行的class Kint_Renderer_Text extends Kint_Renderer文件中定义。

可以假设这意味着单个文件中的类顺序很重要。

但是当我在构建发布文件之前sort()源文件时,travis说一切都顺利完成,尽管新文件也有类似的情况:

https://raw.githubusercontent.com/jnvsor/kint/1a657f06cd693b3f9db8f9458f900ef7bb378b53/build/kint.php

例如,第1249行为class Kint_Object_Closure extends Kint_Object_Instance,第1352行为class Kint_Object_Instance extends Kint_Object

所以问题就变成了:PHP中的类的排序要求究竟是什么?

2 个答案:

答案 0 :(得分:0)

我再一次回答了自己的问题,因为SO上的任何一个人都不会被阅读超过10秒......

原则上,PHP只检查同一文件中的依赖项,而不是递归,然后无法更新错误消息。结果你得到这样的东西:

<?php
class A extends B {} // boom: <b>Fatal error</b>:  Class 'B' not found...
class B extends C {}
class C {}

重新排序依赖项依赖项时,哪个工作正常:

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

超过2次扩展的行为方式相同。如果它是第三类无法找到它的扩展,它仍会报告第二类无法找到:

<?php
class A extends B {} // boom: <b>Fatal error</b>:  Class 'B' not found...
class C extends D {}
class B extends C {}
class D {}

这在7.2(仍然是预发布)中得到修复,它将递归检查,或至少检查更深 - 因为正如我在问题中提到的,这个错误不会在夜间发生。

答案 1 :(得分:-1)

  

PHP中的类的排序要求究竟是什么

必须存在要扩展的类。因此,如果类A扩展了类B并且B在实例化A时未知,则您的代码将失败。您可以使用autoloader来解决这个问题但它会将所有内容保存在一个文件中(这无论如何都是错误的想法)。