#php #segmentation-fault #autoload #magic-methods
#php #ошибка сегментации #автозагрузка #волшебные методы
Вопрос:
У меня возникли проблемы с автозагрузкой классов в магическом __sleep()
методе PHP. Автозагрузка не выполняется, поэтому класс не может быть найден. В попытке отладить это я попытался вызвать 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.
Ответ №1:
Проблема, которую вы описываете, очень похожа на эту запись в PHP bug tracker:
http://bugs.php.net/bug.php?id=53141
Эта ошибка была исправлена в PHP 5.3.4 (поиск «53141» на http://php.net/ChangeLog-5.php).
Комментарии:
1. Это действительно выглядит вероятным, но они упоминают, что это происходит только с включенным mysqlnd; поскольку это также происходит со мной в PHP 5.2, в котором отсутствует mysqlnd, это не совсем то же самое. Я добавлю комментарий там, хотя, поскольку это вполне может быть связано.
2. Они подтвердили, что ошибка не является специфичной для mysqlnd и что она встречается в серии 2.10.x. Спасибо за ваш ответ, теперь мое любопытство удовлетворено 🙂