Добрый день. Я изучаю ООП по книге Зандстры. У него на стр. 86 есть такой код: Код (PHP): class Person { function __get ($property){ $method = "get{$property}"; if (method_exists($this, $method)){ return $this->$method(); } } function getName(){ return "Иван"; } function getAge() { return 44; } } $p = new Person(); print $p->name; Он работает, но я не понимаю, что значит return $this->$method(). По правилам ООП, если пишем $this->, то далее, не ставится знак доллар. Также скобочки ставятся только в случае если это метод или новый объект, а здесь у слова "method" есть скобки и знак доллара. Что значит этот код: return $this->$method()? По моему мнению, должно быть так: return $this->method. Но так не работает. Спасибо. PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
вся идея тут в магическом методе __get. При вызове объекта данного класса, в начале выполняется Код (Text): function __get ($property){ $method = "get{$property}"; if (method_exists($this, $method)){ return $this->$method(); } } И соответственно, если выполняется условие Код (Text): if (method_exists($this, $method)) (типа такой метод в классе существует), далее он и будет вызван по названию Код (Text): return $this->$method();
p@R@dox 55RU, спасибо. Я понял, что в выражении Код (Text): return $this->$method() вместо $method - подставится не объект, ни метод, ни свойство, а просто строка getName, что превратит выражение в такое: Код (Text): return $this->getName() Всё встало на свои места.
Ты выбрал не самый лучший пример для данного вопроса, т.к. тут в довесок используется магическом методе __get, если допустим обойтись без него, то в РНР ты можешь создать функцию: Код (PHP): function fns() { echo 'is fns function!'; } потом имя этой функции записать в переменную: Код (PHP): $val = 'fns'; после чего при помощи этой переменной вызвать эту функцию, вот так вот: Код (PHP): $val();// тоже самое что и fns(); как видишь при таком подходе, при вызове функции через переменную надо писать знак доллара, соответственно так же и у классов, ты можешь записать имя метода в переменную и вызвать его через переменную, но если ты используешь переменную надо писать знак доллара в том числе и у классов. Опять же тут надо разделять, переменная и свойство класса, свойство класса пишется без знака доллара и на сколько я знаю вызывать через него функции и методы по схеме приведенной выше нельзя.
Simeon проще почитать документацию, из неё станет ясно, что это просто магия https://php.net/manual/ru/language.oop5.magic.php