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

发布于 2024-11-08 17:57:25 字数 1330 浏览 0 评论 0原文

我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

屋顶上的小猫咪 2024-11-15 17:57:25

您描述的问题听起来与 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文