【问题标题】:php 5.5.9 gives error when subclass is declared before parentphp 5.5.9 在父类之前声明子类时出错
【发布时间】:2014-07-14 07:39:33
【问题描述】:

在 ubuntu 14.04 服务器上安装 php 5.5.9 时,在父类之前声明子类时出现错误。

testing.class.php

<?php
class mysubclass extends parentclass
{

}

class parentclass
{

}

myheader.inc.php

<?php
// empty header

index.php

error_reporting(E_ALL);
ini_set('display_errors', 1);

require_once 'myheader.inc.php';
require_once 'testing.class.php';

echo "testing";

我收到以下错误

致命错误:无法在第 4 行的 /var/www/clients/client1/web3/web/central/try/php559/testing.class.php 中重新声明 mysubclass 类

当我在 testing.class.php 中替换父类和子类的位置时,我没有收到错误消息。

【问题讨论】:

  • 在我的 5.5.11 安装中(不再出现)这种行为。
  • 这种行为会阻止 egroupware 运行。 class.egw.inc.php 中有这样的构造。更换时它可以工作。我尝试在 ubuntu 服务器 14.04 上升级 PHP,我猜它还没有在存储库中。

标签: php


【解决方案1】:

对此唯一可能的解释是您设置了自动加载器。当 PHP 命中 extends parentclass 时,它会再次自动加载文件以获取其实现,这也会重新加载 mysubclass,从而导致错误。

您需要在子类之前包含/定义/加载父类,没有其他办法。最好每个类也应该在自己的文件中定义。

【讨论】:

  • 自动加载顺序是不是PHP自己定义的,不能被用户定义的自动加载器搞乱?
  • @TiMESPLiNTER PHP 默认不自动加载任何东西,任何自动加载器基本上都是用户定义的自动加载器。
  • 你是对的,但是 PHP 调用注册的自动加载器加载文件的顺序是由 PHP 自己完成的,不是吗?因此 PHP 决定何时触发自动加载器以加载 parentclass,以及何时触发自动加载器加载 mysubclass。所以你不能把顺序和你自己的自动加载器混在一起......
  • 当然。有些东西告诉 PHP 包含这个文件。 PHP 解析文件。 PHP 遇到了无法解析的类定义 (extends parentclass)。 PHP 调用自动加载器。自动加载器包含该文件。 PHP 解析文件,找到它已经知道的类定义 (mysubclass)。错误。
  • 好的,知道了。因此,您的第二个提示是每个文件只应使用一个类,这是在这种情况下最有可能解决问题的关键。
【解决方案2】:

几个月后,我找到了问题的根源;它不是 PHP,它是 xcache。由于 PHP 5.5 包含 opcache,我在服务器上同时运行 xcache 和 opcache。我卸载了xcache,问题消失了。我不知道哪个更好,我更喜欢使用PHP自带的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多