php магические методы



Магические методы php

Автор Неважно Неважно задал вопрос в разделе Другие языки и технологии

Магические методы PHP и получил лучший ответ

Ответ от Капитан Гугл[гуру]
Это называется инкапсуляция: методы __get и __set инкапсулируют данные, хранимые в переменной. Зачем? Чтобы не надо было переписывать код! Например, был написан большой фреймворк, и начиная с какого-то момента решили, что просто присваивания переменной недостаточно, нужно добавить еще запись в БД и добавление в лог сообщения об этом. Объем замены одного действия (присваивания) на 3 по всему тексту фреймворка - дохрена и больше. А так - меняем только __set - и вуаля, всюду, где было одно действие, их стало 3, а код не изменился!
Еще пример: предположим, что у нас есть какой-то объект с кучей кешированых параметров, например, треугольник, в котором хранятся данные о длине сторон, углах, высотах, медианах и т. д. Мы меняем одну сторону - значит, все остальные данные (прилежащие углы и т. д. ) надо менять. Вручную в каждом месте это прописывать неудобно; а так - пишем присваивание, а на самом деле выполняем кучу вычислений. Можно и наоборот: держать значения высот, медиан и др. вторичных параметров undefined до первого запроса, и только потом вычислять (это называется "ленивые вычисления"). Программа, запрашивающая высоту в треугольнике, может быть уверена, что это переменная - а на самом деле это __get, обрабатывающий данные только в момент обращения.

Ответ от ? ?[гуру]
class Test {
private $property;
public function __set($key, $val) {
if (!is_scalar($val)) throw new Exception('Значение должно быть скалярным');
$this->$key = $val;
}
}
$test = new Test;
$test->property = 1; // значение будет успешно присвоено
$test->property = new Test; // будет ошибка
Это для простой реализации инкапсуляции, когда аксессоры ни к чему
---
Добавлено.
Не совсем. Это лишь пример. По некоторым концепциям, валидацией занимаются объекты валидации, а сущности данных лишь хранят в себе данные и состояние объекта.
Нужно в ООП вникнуть, чтобы понять, зачем это нужно
---
Добавлено.
private для скрытого свойства - если оно будет публичным, то __set не будет вызван. Теоретический пример может быть таким: - и из вне никак не отразится работоспособность с этим объектом
---
Добавлено.
Это все прекрасно описано на php.net в соответствующем разделе. Только стоит помнить, что они для публичных свойств не работают и их смысл быть аксессорами.

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Магические методы PHP
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*