Может кто-нибудь объяснить перегрузку с помощью __set и __get?`

Не знаю, правильное ли это место, чтобы задать этот вопрос, но я все равно спрошу. Недавно я смотрел сериал на Lynda.com под названием «Объектно-ориентированное программирование с PHP» и добрался до части о перегрузке. В этом разделе он использует магические методы __get и __set. Я полностью потерялся в том, что они делают, и еще больше потерялся в том, для чего вообще нужны магические методы. Любая помощь будет здорово!


person Joe Scotto    schedule 25.10.2015    source источник


Ответы (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
comment
Я все еще в замешательстве. Если я установлю что-то вроде $a->$variable = "test", я не смогу получить его значение. Должен ли я быть в состоянии? - person Joe Scotto; 26.10.2015
comment
Неважно, я только что понял. __set($name, $value) устанавливает значение неопределенного свойства, а __get($name) определяет это свойство. Пожалуйста, поправьте меня, если я ошибаюсь. - person Joe Scotto; 26.10.2015
comment
Чтобы использовать $a->var = "test", когда var не определен, вам необходимо реализовать метод __set($property, $value), а его тело должно быть $this->$property = $value. Затем вы сможете установить ранее не существовавшее свойство и получить его значение позже (в противном случае доступ к неопределенному свойству возвращает NULL. Немного поэкспериментируйте, чтобы увидеть. - person Oliver Maksimovic; 26.10.2015
comment
Да, я только что понял это. Это даже полезно, и я когда-нибудь использовать его? - person Joe Scotto; 26.10.2015
comment
Лично я избегаю «магии», я предпочитаю, когда все определено :) Кроме того, работа с «магическими» свойствами/методами может запутать IDE и т. д. Всегда полезно знать, как все работает, чтобы вы могли понять код, когда наткнетесь на него. это, но если вы не видите цели для этого в любом проекте, над которым вы работаете, просто не используйте его. - person Oliver Maksimovic; 26.10.2015