Не знаю, правильное ли это место, чтобы задать этот вопрос, но я все равно спрошу. Недавно я смотрел сериал на Lynda.com под названием «Объектно-ориентированное программирование с PHP» и добрался до части о перегрузке. В этом разделе он использует магические методы __get
и __set
. Я полностью потерялся в том, что они делают, и еще больше потерялся в том, для чего вообще нужны магические методы. Любая помощь будет здорово!
Может кто-нибудь объяснить перегрузку с помощью __set и __get?`
Ответы (1)
__set
и __get
вызываются, когда свойство, которое вы пытаетесь установить или получить доступ, не определено в вашем классе или недоступно. Их можно использовать для обработки ошибок или некоторых других целей (например, Eloquent ORM, который «волшебным образом» сопоставляет столбцы таблицы со свойствами объекта).
Допустим, у вас есть этот класс:
class A {
var $a = "I'm A<br/>";
function __get($property)
{
echo "You tried to access '{$property}' which does not exist!<br/>";
} // __get
function __set($property, $value)
{
echo "You tried to set '{$property}' to '{$value}', but '{$property}' is not defined<br/>";
} // __set
}
затем сделайте это, чтобы увидеть результат:
$a = new A();
echo $a->a;
$a->iDoNotExist;
$a->iDoNotExistEither = "boo!";
person
Oliver Maksimovic
schedule
25.10.2015
Я все еще в замешательстве. Если я установлю что-то вроде
$a->$variable = "test"
, я не смогу получить его значение. Должен ли я быть в состоянии?
- person Joe Scotto; 26.10.2015
Неважно, я только что понял.
__set($name, $value)
устанавливает значение неопределенного свойства, а __get($name)
определяет это свойство. Пожалуйста, поправьте меня, если я ошибаюсь.
- person Joe Scotto; 26.10.2015
Чтобы использовать
$a->var = "test"
, когда var
не определен, вам необходимо реализовать метод __set($property, $value)
, а его тело должно быть $this->$property = $value
. Затем вы сможете установить ранее не существовавшее свойство и получить его значение позже (в противном случае доступ к неопределенному свойству возвращает NULL
. Немного поэкспериментируйте, чтобы увидеть.
- person Oliver Maksimovic; 26.10.2015
Да, я только что понял это. Это даже полезно, и я когда-нибудь использовать его?
- person Joe Scotto; 26.10.2015
Лично я избегаю «магии», я предпочитаю, когда все определено :) Кроме того, работа с «магическими» свойствами/методами может запутать IDE и т. д. Всегда полезно знать, как все работает, чтобы вы могли понять код, когда наткнетесь на него. это, но если вы не видите цели для этого в любом проекте, над которым вы работаете, просто не используйте его.
- person Oliver Maksimovic; 26.10.2015