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

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

4

Решение

Похоже, это ошибка в PHP, согласно этот отчет об ошибке с апреля 2014 года и этот отчет об ошибке (со ссылками на исправление) с января 2014 года.

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

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

4

Другие решения

Других решений пока нет …