Сбой при загрузке PHP в __sleep() магическом методе

#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. Спасибо за ваш ответ, теперь мое любопытство удовлетворено 🙂