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

Сегодня я наткнулся на интересный вопрос. В контексте одного файла для нескольких объявлений, если класс 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 w/ suhosin.

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

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

Спасибо!

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

6
задан netcoder 19 December 2011 в 16:11
поделиться