假设我们有两个php文件,a.php和b.php这里是文件a.php的内容:
<?php // content of a.php
class A {
}
Run Code Online (Sandbox Code Playgroud)
这是文件b.php的内容
<?php // content of b.php
include dirname(__FILE__) . "/a.php";
echo "A: ", class_exists("A") ? "exists" : "doesn’t exist", "\n";
echo "B: ", class_exists("B") ? "exists" : "doesn’t exist", "\n";
echo "BA (before): ", class_exists("BA") ? "exists" : "doesn’t exist", "\n";
echo "BB: ", class_exists("BB") ? "exists" : "doesn’t exist", "\n";
class B {
}
class BA extends A {
}
class BB extends B {
}
echo "BA (after): …Run Code Online (Sandbox Code Playgroud) 首先,这有点长,所以谢谢你的阅读.
我的问题类似于这个: 在同一个文件中找不到类
我有一个最初于2008年为PHP 5编写的定制框架,并且多年来它已经升级以使用PHP 5.3.我一直在关注5.4兼容性并遇到了严重的问题.
ORM层自动为每个DB表生成类.这些类都位于每个表的一个文件中,我们的自动加载器在需要时加载该文件.例如,'public'模式(postgresql)中的'customer'表将具有以下类:PublicCustomer,PublicCustomerDBReader,PublicCustomerDBWriter.现在这可能不是理想的设置,但它是我们现在拥有的.
在PHP 5.3中,如果需要PublicCustomer,则将包含,解析该文件,并且所有上述类都可用.因此,例如,如果在PublicCustomer上调用静态方法,并且该方法在PublicCustomerDBReader中调用某些内容,则该方法可以正常工作,因为该类位于同一文件中.
在PHP 5.4中,看起来核心已经完成了一些优化.在上面的场景中:
在PublicCustomer中调用静态方法.
自动装带器查找并加载正确的文件.
PHP解析器只解析它所需的位置; PublicCustomer类.它尚未解析或实例化PublicCustomerDBReader类.我可以通过测试类是否存在来确认这一点,并通过查看解析器在包含它时是否到达文件的末尾,当调用该方法时(它没有).
在我看来,我有两个解决方案:
我是否正确理解了上述问题?
有谁知道在PHP 5.4中是否进行了优化或更改会导致此行为?
我还没有考虑过这个问题的其他潜在解决方案吗?