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.