За последние 24 часа нас посетили 62876 программистов и 1752 робота. Сейчас ищут 1106 программистов ...

static vs self

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

  1. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    Код (PHP):
    1. <?php
    2. class A {
    3.     public static function who() {
    4.         echo __CLASS__;
    5.     }
    6.     public static function test() {
    7.         self::who();
    8.     }
    9. }
    10.  
    11. class B extends A {
    12.     public static function who() {
    13.         echo __CLASS__;
    14.     }
    15. }
    16.  
    17. B::test();
    18. ?>
    19. Результат выполнения данного примера:
    20.  
    21. A
    вопрос такой- как заранее понять нужно использовать self или сразу static?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Используй self для вызова метода в контексте родителя, и static для вызова в контексте наследника, вот и всё =)

    Добавлено спустя 1 минуту 7 секунд:
    http://php.ru/manual/language.oop5.late-static-bindings.html
     
    Dimon2x нравится это.
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    хм.. вроде как такого не должно быть.
    по логике.

    переписали бы этот РНР, что бы к свойству объекта обращатся можно было через точку как в JS и C#, ну и вообще..
     
  4. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну там вместо self:: в методе напишешь static::, будет "B"
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    я опять затупил, а точнее не знал что еще можно писать static::
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    у тебя есть некоторый метод или свойство в некотором классе и есть класс который расширяет первый. если ты будешь обращаться через $this то это будут переменные экземпляра этих классов, parent указывает на родительский класс, через static:: - обращение на этапе после статического связывания - контекст дочернего класса, через self:: - контекст класса в котором идет данное определение.
    пример выше работает примерно так: идет обращение к статическому методу тест() класса Б. метода там такого не описано, зато он унаследован от класса А. self в контексте класса А ссылается на класс А поэтому и вывод дается А. если бы там было статик - контекст бы поменялся бы на класс в котором идет вызов - Б - и на экране было бы Б. примерно так.
     
    Dimon2x нравится это.
  7. vikrorpert

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

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    меня волнует другое- как заранее узнать что в методе test нужно использовать self или static
    я ведь не могу знать заранее захотят расширять класс А или нет
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ну в методах что могут расширить, используй то, что не поломается при наследовании