Може ли някой да обясни претоварването с __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