8

首先,这篇文章有点长,感谢您的阅读。

我的问题与此类似: Class not found in the same file

我有一个最初在 2008 年为 PHP 5 编写的定制框架,多年来它已经升级到可以与 PHP 5.3 一起使用。我一直在研究 5.4 的兼容性并遇到了一个严重的问题。

ORM 层自动为每个 DB 表生成类。这些类都位于每个表的一个文件中,我们的自动加载器会在需要时加载该文件。例如,“公共”模式 (postgresql) 中的“客户”表将具有以下类:PublicCustomer、PublicCustomerDBReader、PublicCustomerDBWriter。现在这可能不是理想的设置,但它是我们目前拥有的。

在 PHP 5.3 中,如果需要 PublicCustomer,则该文件将被包含、解析,并且上述所有类都将可用。因此,例如,如果在 PublicCustomer 上调用了一个静态方法,并且该方法调用了 PublicCustomerDBReader 中的某些内容,那将可以正常工作,因为该类在同一个文件中。

在 PHP 5.4 中,似乎在核心中进行了一些优化。在上述场景中:

  1. 在 PublicCustomer 中调用了一个静态方法。

  2. 自动加载器找到并加载正确的文件。

  3. PHP 解析器只解析到它需要的地方;PublicCustomer 类。它没有解析或实例化 PublicCustomerDBReader 类。我可以通过测试该类是否存在并查看解析器在被包含时是否到达文件末尾以及在调用该方法时(它不存在)来确认这一点。

  4. PublicCustomer 中的方法然后尝试调用 PublicCustomerDBReader 中的方法。这失败了,因为我们的自动加载器已经需要该文件一次。

在我看来,我有两个解决方案:

  1. 将这些类分开,以便每个类都有一个文件(这将产生大量文件)
  2. 重新设计 ORM 层,以便不需要多个类。

我是否正确理解了上述问题?

有谁知道是否在 PHP 5.4 中进行了会导致这种行为的优化或更改?

对于我没有考虑过的问题,还有其他潜在的解决方案吗?

4

2 回答 2

1

将读取器/写入器类放在文件的开头。此外,您可能会考虑提交错误报告,因为解析器应该只在错误时停止。

于 2013-05-11T15:24:11.570 回答
0

参考PHP Framework Interop Group及其自动加载标准PSR-0PSR-4 ,每个类都必须有自己的文件,其名称以.php. 即使您有数千个类,这对文件系统来说也不应该是问题。

一个文件中有多个类,您必须考虑以下方面:

  • 对于每个类,自动加载器必须决定加载哪个文件。如果文件中有多个类,则每个使用的类都会导致负载。类文件应该加载一次而不是多次,因为类不能被重新声明。我不推荐它,但你可以用你自己的自动加载器来处理它,它会记住加载的文件或加载的类的测试。
  • 放在同一个文件中并相互使用的类是有问题的。该问题在稍后在同一文件中定义的派生类中描述“不存在”?并由乔恩回答
于 2014-11-26T21:35:35.107 回答