PHP 自动加载在 __sleep() 魔术方法中失败
我在 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 时会出现这种情况。
I'm having issues with autoloading classes in PHP's magic __sleep()
method. Autoloading doesn't take place, so the class cannot be found. In an attempt to debug this I tried calling spl_autoload_functions()
which then causes PHP to segfault...
The example code below demonstrates the problem. Using an instance method or a static method has the same behaviour. This seems to work fine for me using __destruct()
instead, which suits my use case fine, but I'm curious as to the reason behind this. Is it a PHP bug, or is there a sensible explanation?
In Foo.php
, just as an autoload target
<?php
class Foo {
public static function bar() {
echo __FUNCTION__;
}
}
?>
In 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;
This can be run by placing both files in a directory and running php testcase.php
. This occurs for me with PHP 5.3.3 and 5.2.10.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您描述的问题听起来与 PHP 错误跟踪器中的此条目非常相似:
http://bugs.php.net/bug.php?id=53141
该错误已在 PHP 5.3.4 中修复(在 http://php.net/ChangeLog-5.php)。
The problem you describe sounds very similar to this entry in the PHP bug tracker:
http://bugs.php.net/bug.php?id=53141
That bug was fixed in PHP 5.3.4 (search for "53141" on http://php.net/ChangeLog-5.php).