PHP имеет _get, и функции _set встроили. Лучше записать, что мои собственные получают и функции множества для каждой переменной или еще используют созданный в функциях с тонной если если? Каковы за и против каждого метода?
__get
и __set
- это магические методы, которые обычно следует использовать для решения сложных проблем, а не в качестве основы проектирования.
Например, я оказался в проекте, где мне нужно было проанализировать сайт, использующий ООП с глубоким наследованием (> 2), и один из важных базовых классов имел публичное свойство name
. Однако у него также были геттеры и сеттеры (getName
, setName
), которые обращались к этому свойству только для того, чтобы получить и установить его. Многие классы вызывали getName
и столько же обращались непосредственно к свойству name
! Не лучший дизайн.
Магические методы позволили мне решить проблему, переименовав свойство в _name
и сделав его приватным, заставляя все запросы к свойству проходить через геттеры и сеттеры.
Учитывая это, нет необходимости в геттерах и сеттерах, если вы просто обращаетесь со свойством как с переменной. В этом случае просто сделайте свойство публичным!
В вашем случае, поскольку происходит валидация/санитария, вам следует использовать геттеры и сеттеры и кодировать их непосредственно как методы (вместо того, чтобы без необходимости нести накладные расходы на магические методы).
Вот как я справляюсь с этой проблемой.
final public function __set($key, $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->data[$key] = $this->$method($value);
} else {
$this->data[$key] = $value;
}
}
final public function __get($key) {
$method = 'get' . ucfirst($key);
if (method_exists($this, $method)) {
return $this->$method($this->data[$key]);
} else {
return $this->data[$key];
}
}
Если у вас есть специальный обработчик для свойства, он вызывается (при условии, что он называется getProperty). В противном случае используется магический метод get / set по умолчанию.
Я склонен придерживаться правила, что если у вас сложная логика get или set, то добавьте отдельный метод get или set. Если вы делаете что-то простое, вы можете использовать __get
или __set
, когда в противном случае вы повторяли бы множество пользовательских методов get/set.