У меня проблема с 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