首先,本文有点长,感谢您的阅读。
我的问题与此类似: Class not found in the same file
我有一个定制框架,最初是在 2008 年为 PHP 5 编写的,多年来已经升级到可以与 PHP 5.3 一起使用。我一直在研究 5.4 兼容性并遇到了一个严重的问题。
ORM 层自动为每个数据库表生成类。这些类都位于每个表的一个文件中,我们的自动加载器会在需要时加载该文件。 例如,“公共(public)”模式 (postgresql) 中的“客户”表将具有以下类: PublicCustomer、PublicCustomerDBReader、PublicCustomerDBWriter。 现在这可能不是理想的设置,但这是我们目前拥有的设置。
在 PHP 5.3 中,如果需要 PublicCustomer,文件将被包含、解析并且上述所有类都将变得可用。因此,例如,如果在 PublicCustomer 上调用了一个静态方法,并且该方法调用了 PublicCustomerDBReader 中的某些内容,那将可以正常工作,因为该类位于同一文件中。
在 PHP 5.4 中,似乎在核心中进行了一些优化。在上面的场景中:
在 PublicCustomer 中调用静态方法。
自动加载器找到并加载正确的文件。
PHP 解析器只解析它需要的地方;公共(public)客户类。它没有解析或实例化 PublicCustomerDBReader 类。我可以通过测试该类是否存在以及在包含该方法时查看解析器是否到达文件末尾以及调用该方法时(它没有)来确认这一点。
- PublicCustomer 中的方法然后尝试调用 PublicCustomerDBReader 中的方法。这失败了,因为我们的自动加载器已经需要该文件一次。
在我看来,我有两个解决方案:
- 将这些类分开,使每个类都有一个文件(这将产生大量文件)
- 重新设计 ORM 层,以便不需要多个类。
我是否正确理解了上述问题?
有谁知道 PHP 5.4 中是否进行了优化或更改会导致此行为?
是否还有其他我没有考虑过的潜在解决方案?
最佳答案
将读写器类放在文件的头部。您也可以考虑提交错误报告,因为解析器应该只在出现错误时停止。
关于PHP 5.4 与 5.3 : Autoloading multiple classes in the same file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16395317/