За последние 24 часа нас посетили 82397 программистов и 6038 роботов. Сейчас ищут 2080 программистов ...

Порядок определения классов в файле

Тема в разделе "PHP для новичков", создана пользователем plord, 16 янв 2013.

  1. plord

    plord Активный пользователь

    С нами с:
    16 янв 2013
    Сообщения:
    24
    Симпатии:
    0
    Берем файл и пишем:
    Код (Text):
    1.  
    2. class Programmer extends Worker
    3. {
    4. }
    5.  
    6. class Worker extends Human
    7. {
    8. }
    9.  
    10. class Human
    11. {
    12. }
    - не работает, пока не поменяешь местами Worker и Human. При этом то, что класс Programmer объявлен выше класса, который он расширяет - это как-бы нормально.

    Объясните плз логику поведения пыха в этом случае.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    не работает потому что нельзя объявлять класс в теле другого класса, скобки проверь.

    Добавлено спустя 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.
    =)
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    у меня вообще никак не срабатывает, что логично, ибо(выдержка из мануала):
    может чтото изменилось в последних версиях пыха. но об этом я ничего не слышал почемуто
     
  4. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Не смог удержаться.Просто меня аж подкидывает, когда к пыху применяется слово парсер%). Нет парсера та там! Компилятор там есть, ну может и есть парсер но тогда он используется только в "Петя - $name"
    А то что этот код не работает--это очевидно, и не "парсер" тут виноват, а то, что банально Human не существует во время определения Worker. И так во всех ЯП, ну не выгодно сначала инициализировать все переменные, а потом выполнять программу%). Я бы сначала описал Human, потом Worker, потом Programmer рядышком, но не один в другом%), может это не правильно, но я придерживаюсь такой концепции программирования
    Код (Text):
    1. class Human
    2. {
    3. }
    4.  
    5. class Worker extends Human
    6. {
    7. }
    8.  
    9. class Programmer extends Worker
    10. {
    11. }
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вы где там компилятор нашли? ))))
    PHP - транслирующий интерпретатор.
    тоесть сначала код транслируется в исполняемый байткод, а потом уже интерпретируется(тоесть выполняется сразу инструкция за инструкцией)

    компиляция это несколько(совсем) другое.

    Добавлено спустя 5 минут 19 секунд:
    в каких во всех?
    на вскидку - Java, Python - вложенные классы разрешены. есть свои особенности и ограничения конечно. но синтаксически поддерживается.

    Добавлено спустя 5 минут 29 секунд:
    ну а наследование от еще неописанных классов. это конечно неподдерживается.
     
  6. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    тут я имел ввиду то что нельзя получить доступ к переменной, которая не инициализирована(будет инициализирована далее по коду).
    Тут я соглашусь, не так выразился, просто меня задело то что
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.372
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот такое работает:
    Код (PHP):
    1. <?php
    2. class Worker extends Human {
    3.     public function say() {
    4.         echo "Worker: {$this->someVar}";
    5.     }
    6. }
    7.  
    8. class Programmer extends Worker {
    9.     public function say() {
    10.         echo "Programmer: {$this->someVar}";
    11.     }
    12. }
    13.  
    14. class Human {
    15.     protected $someVar = 'Hello, World!';
    16. }
    17.  
    18. $Worker = new Worker();
    19. $Worker->say();
    20.  
    21. echo '<br />';
    22.  
    23. $Programmer = new Programmer();
    24. $Programmer->say();
    25. ?>
    А вот такое уже нет:
    Код (PHP):
    1. <?php
    2. class Programmer extends Worker {
    3.     public function say() {
    4.         echo "Programmer: {$this->someVar}";
    5.     }
    6. }
    7.  
    8. class Worker extends Human {
    9.     public function say() {
    10.         echo "Worker: {$this->someVar}";
    11.     }
    12. }
    13.  
    14. class Human {
    15.     protected $someVar = 'Hello, World!';
    16. }
    17.  
    18. $Worker = new Worker();
    19. $Worker->say();
    20.  
    21. echo '<br />';
    22.  
    23. $Programmer = new Programmer();
    24. $Programmer->say();
    25. ?>
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    я не понимаю, какое отношение принцип выполнения программного кода имеет к разбору исходного кода
     
  9. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Не, то что якобы парсер помещает то, помещает это%). Короче проехали xD
     
  10. plord

    plord Активный пользователь

    С нами с:
    16 янв 2013
    Сообщения:
    24
    Симпатии:
    0
    Ребят, я дико извиняюсь, конечно же я скобочку не туда поставил, так как вложенных классов в пыхе нету впринципе и обсуждать тут нечего. Поправил исходный пост. На счет двух проходов самая правдоподобная теория :)

    Я после Java на пыхе стал писать и некоторые особенности его ООП для меня в новинку. В общем наткнулся на это поведение, когда весь зенд фв в один файл сливал, пришлось использовать автолоад, чтобы выстроить дерево зависимостей и сложить классы в нужном порядке.