PHP自动加载在__sleep()魔术方法中失败

时间:2011-05-20 01:40:16

标签: php segmentation-fault autoload magic-methods

我在PHP的魔术__sleep()方法中遇到自动加载类的问题。自动加载不会发生,因此找不到类。为了调试这个,我尝试调用spl_autoload_functions()然后导致PHP进行段错误...

下面的示例代码演示了该问题。使用实例方法或静态方法具有相同的行为。这对我来说似乎很适合使用__destruct(),这很适合我的用例,但我很好奇这背后的原因。这是一个PHP错误,还是有合理的解释?

Foo.php中,就像自动加载目标一样

<?php
class Foo {
    public static function bar() {
        echo __FUNCTION__;
    }
}
?>

testcase.php

<?php
class Autoloader {
    public static function register() {
        // Switch these calls around to use a static or instance autoload function
        spl_autoload_register('Autoloader::staticLoad');
        //spl_autoload_register(array(new self, 'instanceLoad'));
    }

    public function instanceLoad($class) {
        require_once dirname(__FILE__) . '/' . $class . '.php';
    }

    public static function staticLoad($class) {
        require_once dirname(__FILE__) . '/' . $class . '.php';
    }
}
Autoloader::register();

class Bar {
    public function __sleep() {
        // Uncomment the next line to segfault php...
        // print_r(spl_autoload_functions());
        Foo::bar();
    }
}
$bar = new Bar;

这可以通过将两个文件放在目录中并运行php testcase.php来运行。对于PHP 5.3.3和5.2.10,我会发生这种情况。

1 个答案:

答案 0 :(得分:1)

您描述的问题听起来与PHP错误跟踪器中的此条目非常相似:
http://bugs.php.net/bug.php?id=53141

该错误已在PHP 5.3.4中修复(在http://php.net/ChangeLog-5.php上搜索“53141”)。