我有一个用classpreloader创建的文件和一些自定义代码,它们将一堆类文件压缩成一个文件进行分发:
根据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说一切都顺利完成,尽管新文件也有类似的情况:
例如,第1249行为class Kint_Object_Closure extends Kint_Object_Instance
,第1352行为class Kint_Object_Instance extends Kint_Object
所以问题就变成了:PHP中的类的排序要求究竟是什么?
答案 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来解决这个问题但它会将所有内容保存在一个文件中(这无论如何都是错误的想法)。