Сбой автозагрузки PHP в магическом методе __sleep () - PullRequest
2 голосов
/ 20 мая 2011

У меня проблемы с автозагрузкой классов в магическом методе PHP __sleep(). Автозагрузка не происходит, поэтому класс не найден. В попытке отладить это я попытался вызвать spl_autoload_functions(), что затем приводит к segfault 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 Ответ

1 голос
/ 20 мая 2011

Проблема, которую вы описываете, очень похожа на эту запись в трекере ошибок PHP:
http://bugs.php.net/bug.php?id=53141

Эта ошибка была исправлена ​​в PHP 5.3.4 (поиск «53141» на http://php.net/ChangeLog-5.php).

...