PHP get & set или уникальные функции get и set для каждой переменной?
PHP имеет встроенные функции _get и _set. Лучше ли написать мои собственные функции get и set для каждой переменной или использовать встроенные функции с тонной if else if? Каковы плюсы и минусы каждого метода?
3 ответов
__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 magic по умолчанию.
Я склонен следовать правилу, что если у вас есть сложная логика get или set, добавьте отдельный метод get или set. Если вы делаете что-то простое, вы можете использовать __get
или __set
когда вы в противном случае повторите себя во многих пользовательских методах get/set.