Это позволяет вам делать такие вещи:
class myclass {
private $propertybag;
public function __get($name) {
if(isset($this->propertybag[$name]) {return $this->propertybag[$name];}
throw new Exception("Unknown property " . (string) $name);
}
}
Затем вы можете заполнить $propertybag
из SQL-запроса одной строкой, вместо того, чтобы задавать целый набор свойств одно за другим.
Кроме того, он позволяет вам иметь определенные свойства, которые доступны только для чтения (то есть не позволяют изменять их с помощью __set()
). Может быть полезным для поля идентификатора, например.
Кроме того, вы можете поместить код в __get()
и __set()
, чтобы вы могли сделать что-то более сложное, чем просто получение или установка одной переменной. Например, если у вас есть поле storeID
, вы также можете указать свойство storeName
. Вы можете реализовать это в __get()
с помощью поиска перекрестных ссылок, так что вам может не понадобиться имя, которое фактически будет храниться в классе. И, конечно, storeName
не хотел бы быть реализованным в __get()
.
Там много возможностей.
Конечно, есть некоторые недостатки использования магических методов. Самым большим для меня является тот факт, что вы теряете функцию автозаполнения в вашей IDE. Это может иметь или не иметь значения для вас.