2

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。これは、PHP5.3.3および5.2.10で発生します。

4

1 に答える 1

1

あなたが説明する問題は、PHPバグトラッカーのこのエントリと非常によく似ています:http: //bugs.php.net/bug.php?
id = 53141

このバグはPHP5.3.4で修正されました( http://php.net/ChangeLog-5.phpで「53141」を検索してください)。

于 2011-05-20T01:49:30.367 に答える