_get PHP и _set или уникальный добираются и функции множества для каждой переменной?

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

6
задан Josh Curren 21 June 2010 в 02:37
поделиться

3 ответа

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

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

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

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

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

4
ответ дан 10 December 2019 в 02:42
поделиться

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

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

3
ответ дан 10 December 2019 в 02:42
поделиться

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

2
ответ дан 10 December 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: