За последние 24 часа нас посетили 62124 программиста и 1791 робот. Сейчас ищут 945 программистов ...

Что значит этот код: return $this->$method();

Тема в разделе "Прочие вопросы по PHP", создана пользователем Simeon, 10 май 2015.

  1. Simeon

    Simeon Новичок

    С нами с:
    10 май 2015
    Сообщения:
    2
    Симпатии:
    0
    Добрый день. Я изучаю ООП по книге Зандстры. У него на стр. 86 есть такой код:
    Код (PHP):
    1. class Person {
    2.   function __get ($property){
    3.     $method = "get{$property}";
    4.     if (method_exists($this, $method)){
    5.       return $this->$method();
    6.     }
    7.   }
    8.   function getName(){
    9.     return "Иван";
    10.   }
    11.   
    12.   function getAge() {
    13.     return 44;
    14.   }
    15. }
    16.  
    17. $p = new Person();
    18. print $p->name;
    Он работает, но я не понимаю, что значит return $this->$method(). По правилам ООП, если пишем $this->, то далее, не ставится знак доллар. Также скобочки ставятся только в случае если это метод или новый объект, а здесь у слова "method" есть скобки и знак доллара.

    Что значит этот код: return $this->$method()?
    По моему мнению, должно быть так: return $this->method. Но так не работает.

    Спасибо.

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

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    вся идея тут в магическом методе __get. При вызове объекта данного класса, в начале выполняется
    Код (Text):
    1. function __get ($property){
    2.     $method = "get{$property}";
    3.     if (method_exists($this, $method)){
    4.       return $this->$method();
    5.     }
    6.   }
    И соответственно, если выполняется условие
    Код (Text):
    1.     if (method_exists($this, $method))
    (типа такой метод в классе существует), далее он и будет вызван по названию
    Код (Text):
    1. return $this->$method();
    :)
     
  3. Simeon

    Simeon Новичок

    С нами с:
    10 май 2015
    Сообщения:
    2
    Симпатии:
    0
    p@R@dox 55RU, спасибо. Я понял, что в выражении
    Код (Text):
    1. return $this->$method()
    вместо $method - подставится не объект, ни метод, ни свойство, а просто строка getName, что превратит выражение в такое:

    Код (Text):
    1. return $this->getName()
    Всё встало на свои места.
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ты выбрал не самый лучший пример для данного вопроса, т.к. тут в довесок используется магическом методе __get, если допустим обойтись без него, то в РНР ты можешь создать функцию:
    Код (PHP):
    1. function fns()
    2. {
    3.     echo 'is fns function!';
    4. }
    потом имя этой функции записать в переменную:
    Код (PHP):
    1. $val = 'fns';
    после чего при помощи этой переменной вызвать эту функцию, вот так вот:
    Код (PHP):
    1. $val();// тоже самое что и fns();  
    как видишь при таком подходе, при вызове функции через переменную надо писать знак доллара, соответственно так же и у классов, ты можешь записать имя метода в переменную и вызвать его через переменную, но если ты используешь переменную надо писать знак доллара в том числе и у классов.

    Опять же тут надо разделять, переменная и свойство класса, свойство класса пишется без знака доллара и на сколько я знаю вызывать через него функции и методы по схеме приведенной выше нельзя.
     
  5. denis01

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

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