У меня проблема с 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 ");
}
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? Если да, то в какой версии это исправлено? Или это моя вина, потому что автозагрузка в блоках 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
Похоже, это ошибка в PHP, согласно этот отчет об ошибке с апреля 2014 года и этот отчет об ошибке (со ссылками на исправление) с января 2014 года.
Комментарий от назначенного лица:
Как мы уже говорили, это известная проблема, которая должна быть исправлена в 5.6+, но из-за разрыва ABI мы не можем довести исправление до 5.5 …
Других решений пока нет …