_Get & _set PHP или уникальные функции get и set для каждой переменной? - PullRequest
6 голосов
/ 21 июня 2010

В PHP встроены функции _get и _set. Лучше написать свои собственные функции get и set для каждой переменной или использовать встроенные функции с большим количеством if если if? Каковы плюсы и минусы каждого метода?

Ответы [ 3 ]

4 голосов
/ 21 июня 2010

__get и __set - магические методы, которые обычно следует использовать для решения сложных задач, а не в качестве основы для проектирования.

Например, я попал в проект, где мне пришлось проанализировать сайт, который использовал ООП с глубоким наследованием (> 2), а один из важных базовых классов имел открытое свойство под названием name. Тем не менее, он также имел геттеры и сеттеры (getName, setName), которые обращались к этому свойству только с целью его получения и установки. Многие классы с именем getName и столько же обращаются к свойству name напрямую! Не отличный дизайн.

Магические методы позволили мне решить проблему, переименовав свойство в _name и сделав его приватным, форсируя все запросы к свойству через геттеры и сеттеры.

При этом нет необходимости в методах получения и установки, если вы просто обрабатываете свойство как переменную. В таком случае просто сделайте собственность публичной!

В вашем случае, поскольку происходит проверка / дезинфекция, вы должны использовать геттеры и сеттеры и кодировать их напрямую как методы (вместо ненужных накладных расходов от магических методов).

3 голосов
/ 21 июня 2010

Вот как я справляюсь с этой проблемой.

  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 по умолчанию.

2 голосов
/ 21 июня 2010

Я склонен придерживаться правила, согласно которому, если у вас сложная логика get или set, добавьте отдельный метод get или set. Если вы делаете что-то простое, вы можете использовать __get или __set, если в противном случае вы повторяете себя во многих пользовательских методах get / set.

...