Я думаю, что одна часть является ошибкой ...
Интерпретатор PHP работает иначе, если вы расширяете класс.
Это работает:
<?php
class a {}
exit();
class a extends Exception {}
?>
Этоне:
<?php
class a extends Exception {}
exit();
class a {}
?>
Из того, что я вижу в PHP 5.4.0 source , есть две разные функции, которые обрабатывают связывание классов: do_bind_class:4494
для автономных классов иdo_bind_inherited_class:4533
для унаследованных классов (тех, которые используют ключевое слово extends).
Автономная функция имеет условие, которое игнорирует повторяющиеся определения классов во время компиляции, если оно никогда не срабатывает во время выполнения.В версии унаследованного класса отсутствует это условное условие (может быть, умышленно, а может и нет).
Я бы исправил унаследованную функцию, чтобы иметь то же самое условие, протестировал и отправил ее разработчикам.другая часть - это особенность ...
Что касается части вашего условного класса: я считаю, что PHP загрузит ваш класс во время компиляции, если он объявлен в глобальной области видимости, но если он содержится внутри блока,он не будет загружен до тех пор, пока не будет выполнен.
Это работает:
<?php
$a = new A();
//{
class A {}
//}
?>
Это не работает, даже если оно логически идентично:
<?php
$a = new A();
{
class A {}
}
?>
Когда вы объединяете эти две части функциональности, возникает ваша проблема, поскольку ваш класс является унаследованным классом и объявлен в глобальной области видимости.