За последние 24 часа нас посетили 17726 программистов и 1712 роботов. Сейчас ищет 931 программист ...

Как работать с классами в PHP

Тема в разделе "PHP для новичков", создана пользователем topas, 6 мар 2008.

  1. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Есть код:

    PHP:
    1. <?php
    2.  
    3. class A
    4. {
    5.     public function foo()
    6.     {
    7.         var_dump($this);
    8.     }
    9.    
    10.     public static function bar()
    11.     {
    12.         var_dump($this);
    13.     }
    14. }
    15.  
    16. class B
    17. {
    18.     public function test()
    19.     {
    20.         A::foo();
    21.         A::bar();
    22.     }
    23. }
    24.  
    25. $b = new B();
    26. $b->test();
    27.  
    28. ?>
    Кто может сказать каков будет результат. Меня например поведение PHP ввело в легкий ступор
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Статический метод ничего не знает о $this. Он может обратиться только к статической переменной класса.

    А результатом работы будет E_STRICT и E_NOTICE. Сначала ты вызываешь не статический метод статически, а потом обращаешься из статического метода к $this.
     
  3. Anonymous

    Anonymous Guest

    Что именно тебя смущает?
     
  4. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Самое странное для меня, что php считает это нормальным:

     
  5. Clone

    Clone Guest

    ПХП 5.2.1
    Статичесткая функция класса не имеет доступа к экземпляру($this), а класс A, видимо, получает доступ к глобальной переменной $this...
     
  6. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    результат...

    В первом случае $this рассматривается как объект B, во втором как NULL

    Смущает первый случай :)
     
  7. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В первом случае не статический метод.
     
  8. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    И что, разве это дает право классу A оперировать объектом B
     
  9. Anonymous

    Anonymous Guest

    Кстати, статика не наследуется, а остается принадлежать к классу-родителю.
     
  10. Anonymous

    Anonymous Guest

    Это дает право классу В оперировать самим собой, ибо он унаследовал этот метод.
     
  11. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    где ты видешь наследование?
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Тебя PHP предупреждает об этом:
    Зачем писать неправильный код, а потом спрашивать, а что тут не так?
     
  13. Anonymous

    Anonymous Guest

    Тут кстати еще надо учесть, что если Zend Engine будет работать в режиме совместимости с 1 версией, то он будет делать так: http://php.net/static#language.variable ... references
     
  14. Anonymous

    Anonymous Guest

    Упс, соврал :)
     
  15. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Неожиданное поведение программы заставило найти меня метод, который я забыл прописать как статический
    Ошибок кстати не выдал: php5.2.0, error_reporting(E_ALL)
     
  16. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Пальцем ткни, где $this был глобальным?
     
  17. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. error_reporting(E_ALL | E_STRICT)
     
  18. Clone

    Clone Guest

    Да, функция, вызваная из метода не имеет доступа к $this, значит это баг конкретной реализации ООП...
     
  19. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Присоединяюсь, хотя разработчики php решили что так оно и должно быть.
    Как никак в документации пример этой конструкции есть, и поведение это описано :(
     
  20. Clone

    Clone Guest

    Да в плане реализации ООП php ваще далековат от идеала... Я лично ООП никогда бы не начал изучать по PHP. Вернее, PHP я начал изучать раньше чем VB.NET, но в вб я стал использовать хоть что-то из ООП раньше, чем в PHP.