Класс, реализующий интерфейс, должен быть объявлен перед дочерним классом?

сегодня я наткнулся на интересный вопрос. В контексте одного файла для нескольких объявлений, если class B реализует интерфейс A, и класс C расширяет класс A, класс B должен быть объявлен до класс C.

следующий код не работает:

interface A {}
class C extends B {} // Class 'B' not found
class B implements A {}

это фиксирует это:

interface A {}
class B implements A {}
class C extends B {} // Class 'B' is found

но это прекрасно работает:

class A {}
class C extends B {} // Class 'B' is found
class B extends A {}

это мои результаты на PHP 5.3.8 (Win32) и PHP 5.3.3-1ubuntu9.6 Ж / сухосин.

Итак, вопрос в том,это документированное поведение? почему он будет работать с классами, но не с интерфейсами? Или это следует считать ошибкой?

Дайте мне знать о вашем опыте, прежде чем я буду копаться в исходном коде PHP и/или открыть билет ошибки PHP. :)

спасибо!

примечание: Я знаю, что это просто вопрос порядка объявления класса, но это озадачивает меня... Если это неуместно, пожалуйста, не стесняйтесь закрывать.

1 ответов


Да, это документированное поведение:

Наследование Объекта (Примечание):

Автозагрузка, если не используется, то классы должны быть определены до их использования. если класс расширяет другой, то родительский класс должен быть объявлен перед дочерней структурой класса. Это правило применяется к классу, который наследует другие классы и интерфейсы.

в PHP: extends-руководство (Примечание)

классы должны быть определены до их использования! Если вы хотите, чтобы класс Named_Cart расширил корзину классов, вам сначала нужно будет определить корзину классов. Если вы хотите создать другой класс с именем Yellow_named_cart на основе класса Named_Cart, вы должны сначала определить Named_Cart. Короче говоря: важен порядок, в котором определяются классы.


неопределенное поведение (с добавлением сарказм)

несмотря на то, что ваш третий пример может word, он не работает в соответствии с документацией (и я не могу найти запись журнала изменений, указывающую, что это функция, введенная).

документация PHP, к сожалению, не 100%, но вы можете доверять только тому, что знаете, и приведенные выше цитаты-все, что я могу найти по этому вопросу.

вы можете назвать это ошибкой, но в C++ мы бы описали ее как undefined behavior ie. чего не должно быть принято на.


Если "стандарт" (документация) не упоминает об этом, это небезопасно использовать.

Если "стандарт" (документация) не упоминает об этом, это может заставить Вселенную взорваться - или raptor прыгнуть через ваше окно. не делайте ничего, что может убить нас всех!