Фактическая функциональность магических методов полностью зависит от разработчика, чтобы справиться с ним любым удобным для них способом.Разница в том, как они вызываются.
$obj->property; // invokes __get(), if defined
$obj->method(); // invokes __call(), if defined
$obj(); // invokes __invoke() if defined (php 5.3+)
и т. Д.Так что если вы хотите, чтобы __get()
вызывал метод внутри, вы можете.То, как вы хотите справиться с этим, полностью зависит от того, как вы хотите создать свое приложение.
О __get()
, если у вас есть открытый член и вы пытаетесь вызвать его с помощью ->
, __get()
не будетПожар.Однако, если вы попытаетесь получить доступ к недоступному участнику (либо защищенному, частному, либо несуществующему), __get()
сработает, и вы сможете справиться с ним так, как вам нравится.
Насколько я понимаю, основная цель__get()
по крайней мере, согласно php, это исключает необходимость писать геттеры для каждого члена.Сравните с __set()
для сеттеров.Я не хочу вдаваться в подробности, но я думаю, что использование геттеров / сеттеров должно поднять некоторые красные флаги о дизайне.Тем не менее, целевое назначение __get()
не должно соблюдаться, за исключением стандартов тех, кто разрабатывает приложение.
Два примера использования __get()
могут быть инициализировать свойство, которое может непотребуются при создании экземпляра (например, по запросу БД), таким образом уменьшая накладные расходы.Другой может быть, если у вас есть свойства, хранящиеся в массиве, magical get может вернуть значение, сопоставленное с ключом запрошенного свойства.
С помощью магических функций php вы можете делать очень интересные вещи и писатькод, который является более расширяемым с помощью этих специальных вызовов.Что-то, что мне нравится делать:
class application {
public function __call($_, $_) {
throw new Exception("PUT and DELETE not supported");
}
public function POST() {
//update data
header("Location: $_SERVER[PHP_SELF]", true, 303);
}
public function GET() {
//display data
}
public static function inst() {
return new self;
}
}
application::inst()->$_SERVER['REQUEST_METHOD']();
Конечно, это использует __call()
вместо __get()
, но принцип тот же.В данном случае это просто проверка работоспособности.