相关疑难解决方法(0)

稍后在同一文件中定义的派生类"不存在"?

假设我们有两个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)

php extends class require include

18
推荐指数
1
解决办法
1789
查看次数

PHP 5.4 vs 5.3:在同一文件中自动加载多个类

首先,这有点长,所以谢谢你的阅读.

我的问题类似于这个: 在同一个文件中找不到类

我有一个最初于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中,看起来核心已经完成了一些优化.在上面的场景中:

  1. 在PublicCustomer中调用静态方法.

  2. 自动装带器查找并加载正确的文件.

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

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

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

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

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

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

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

php

8
推荐指数
1
解决办法
1999
查看次数

标签 统计

php ×2

class ×1

extends ×1

include ×1

require ×1