У меня проблема с 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
Так что действительно ошибка, стрелять. Мне потребовалось несколько часов, чтобы выяснить, и такие автозагрузчики повсюду в моем коде. Угадайте, что это то, что вы получаете за использование языка с незрелыми функциями ... В любом случае, спасибо вам за это! – gexicide
Проблема, по-видимому, исправлена в версии 5.6.1 (см. [Здесь] (http://php.net/ChangeLog-5.php#5.6.1) –