Берем файл и пишем: Код (Text): class Programmer extends Worker { } class Worker extends Human { } class Human { } - не работает, пока не поменяешь местами Worker и Human. При этом то, что класс Programmer объявлен выше класса, который он расширяет - это как-бы нормально. Объясните плз логику поведения пыха в этом случае.
не работает потому что нельзя объявлять класс в теле другого класса, скобки проверь. Добавлено спустя 17 минут 30 секунд: Гм, действительно порядок влияет. В PHP порядок объявления классов не должен влиять на возможность расширения. Поэтому можно предположить, что парсер, разбирая документ, делает два прохода: сначала помещает в память классы, которые объявлены просто, и классы, которые расширяют тех, которые встретились выше. Таким образом, к концу документа в памяти оказываются все простые классы, после чего парсер снова проходит файл в поиске наследующих классов, родители которых были загружены при первом проходе. Мы так и наблюдаем в работающем коде. Парсер: 1) игнорит class Programmer extends Worker 2) помещает в память Human 3) помещает в память Worker, потому что Human к этому моменту объявлен 4) Возвращается в начало и помещает в память Programmer в неисправном варианте: 1) игнорит Programmer, потому что нет Worker 2) игнорит Worker, потому что нет Human 3) помещает в память Human 4) Возвращается в началао, натыкается на Programmer и решает, что класса Worker в коде небыло. Эта гипотеза подтверждается тем, что есть еще одна рабочая конфигурация: сначала Worker, потом Human и Programmer. =)
у меня вообще никак не срабатывает, что логично, ибо(выдержка из мануала): может чтото изменилось в последних версиях пыха. но об этом я ничего не слышал почемуто
Не смог удержаться.Просто меня аж подкидывает, когда к пыху применяется слово парсер%). Нет парсера та там! Компилятор там есть, ну может и есть парсер но тогда он используется только в "Петя - $name" А то что этот код не работает--это очевидно, и не "парсер" тут виноват, а то, что банально Human не существует во время определения Worker. И так во всех ЯП, ну не выгодно сначала инициализировать все переменные, а потом выполнять программу%). Я бы сначала описал Human, потом Worker, потом Programmer рядышком, но не один в другом%), может это не правильно, но я придерживаюсь такой концепции программирования Код (Text): class Human { } class Worker extends Human { } class Programmer extends Worker { }
вы где там компилятор нашли? )))) PHP - транслирующий интерпретатор. тоесть сначала код транслируется в исполняемый байткод, а потом уже интерпретируется(тоесть выполняется сразу инструкция за инструкцией) компиляция это несколько(совсем) другое. Добавлено спустя 5 минут 19 секунд: в каких во всех? на вскидку - Java, Python - вложенные классы разрешены. есть свои особенности и ограничения конечно. но синтаксически поддерживается. Добавлено спустя 5 минут 29 секунд: ну а наследование от еще неописанных классов. это конечно неподдерживается.
тут я имел ввиду то что нельзя получить доступ к переменной, которая не инициализирована(будет инициализирована далее по коду). Тут я соглашусь, не так выразился, просто меня задело то что
Вот такое работает: Код (PHP): <?php class Worker extends Human { public function say() { echo "Worker: {$this->someVar}"; } } class Programmer extends Worker { public function say() { echo "Programmer: {$this->someVar}"; } } class Human { protected $someVar = 'Hello, World!'; } $Worker = new Worker(); $Worker->say(); echo '<br />'; $Programmer = new Programmer(); $Programmer->say(); ?> А вот такое уже нет: Код (PHP): <?php class Programmer extends Worker { public function say() { echo "Programmer: {$this->someVar}"; } } class Worker extends Human { public function say() { echo "Worker: {$this->someVar}"; } } class Human { protected $someVar = 'Hello, World!'; } $Worker = new Worker(); $Worker->say(); echo '<br />'; $Programmer = new Programmer(); $Programmer->say(); ?>
Ребят, я дико извиняюсь, конечно же я скобочку не туда поставил, так как вложенных классов в пыхе нету впринципе и обсуждать тут нечего. Поправил исходный пост. На счет двух проходов самая правдоподобная теория Я после Java на пыхе стал писать и некоторые особенности его ООП для меня в новинку. В общем наткнулся на это поведение, когда весь зенд фв в один файл сливал, пришлось использовать автолоад, чтобы выстроить дерево зависимостей и сложить классы в нужном порядке.