PHP, наконец, блокирует прерывания при автозагрузке

У меня проблема с finally блоками и автозагрузкой. Я использую PHP 5.5.9. Вот минимальный пример:

<?php

function loadMyClass($class){
include_once $class . '.php';
}
spl_autoload_register("loadMyClass");

try {
    try {
        // Test::printIt("before ");   <--- (1) Commented for now
        throw new Exception();
    }
    finally {
        echo "finally1 "
        Test::printIt("finally2 ");
    }
}
catch (Exception $e) {
    Test::printIt("catch ");
}

Тест.php:

<?php
class Test {
    public static function printIt($i) { echo $i; }
}

Как видите, мы создали исключение и хотим, чтобы выполнялись блоки finally и catch. Test::printIt — это простой метод, который вызывает echo для своего параметра. Класс Test загружается через зарегистрированную функцию автозагрузки. Запуск этой программы выводит finally1 catch вместо finally1 finally2 catch, поэтому вызов Test::printIt(1);, по-видимому, прерывает блок finally. Проблема видимо в автозагрузке в блоке finally. Если раскомментировать строку (1), то Test уже загружается в блок finally. В этом случае before finally1 finally2 catch отображается правильно.

В чем проблема? Это ошибка в PHP? Если да, то в какой версии это исправлено? Или это моя вина, потому что автозагрузка должна давать сбой в блоках finally?

Это моя точная версия PHP, выведенная php -v:

PHP 5.5.9-1ubuntu4 (cli) (built: Apr  9 2014 17:11:57) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

person gexicide    schedule 05.10.2014    source источник


Ответы (1)


Судя по этому отчету об ошибке от апреля 2014 года, это ошибка в PHP. и отчет об ошибке (со ссылками на исправление) за январь 2014 г.

Комментарий назначенного лица:

Как мы уже говорили, это известная проблема, которая должна быть исправлена ​​в 5.6+, но из-за поломки ABI мы не можем довести исправление до 5.5...

person Jeff Lambert    schedule 05.10.2014
comment
Так что действительно баг, стреляйте. Мне понадобилось несколько часов, чтобы разобраться, и такие автозагрузочные бомбы повсюду в моем коде. Думаю, это то, что вы получаете за использование языка с незрелыми функциями... В любом случае, спасибо, что прояснили это! - person gexicide; 05.10.2014
comment
Похоже, проблема исправлена ​​в версии 5.6.1 (см. здесь). - person Jeff Lambert; 05.10.2014