我在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,我会发生这种情况。
答案 0 :(得分:1)
您描述的问题听起来与PHP错误跟踪器中的此条目非常相似:
http://bugs.php.net/bug.php?id=53141
该错误已在PHP 5.3.4中修复(在http://php.net/ChangeLog-5.php上搜索“53141”)。