2014-10-05 7 views
4

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

<?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 "); 
} 

test.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? Если да, в какой версии он исправлен? Или это моя ошибка, потому что автозагрузка, как предполагается, терпит неудачу в окончательных блоках?

Это моя точная версия 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 

ответ

4

Это, кажется, ошибка в PHP, в соответствии с this bug report с апреля 2014 года и this bug report (со ссылками на исправление) с января 2014 года.

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

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

+0

Так что действительно ошибка, стрелять. Мне потребовалось несколько часов, чтобы выяснить, и такие автозагрузчики повсюду в моем коде. Угадайте, что это то, что вы получаете за использование языка с незрелыми функциями ... В любом случае, спасибо вам за это! – gexicide

+0

Проблема, по-видимому, исправлена ​​в версии 5.6.1 (см. [Здесь] (http://php.net/ChangeLog-5.php#5.6.1) –

Смежные вопросы