У меня проблемы с автозагрузкой классов в магическом методе 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.