我的问题类似于这个问题:
Class not found in the same file
我有一个最初于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类.我可以通过测试类是否存在来确认这一点,并通过查看解析器在包含时是否到达文件的末尾,以及调用该方法时(它没有).
>然后,PublicCustomer中的方法尝试在PublicCustomerDBReader中调用方法.这失败了,因为我们的自动加载器已经需要该文件一次.
在我看来,我有两个解决方案:
>将这些类分开,以便每个文件都有一个文件(这将产生大量文件)
>重新设计ORM层,以便不需要多个类.
我是否正确理解了上述问题?
有谁知道在PHP 5.4中是否进行了优化或更改会导致此行为?
我还没有考虑过这个问题的其他潜在解决方案吗?