Единственным преимуществом __get()
является возможность меньшего количества кода, но даже в этом случае это не обязательно так. Например, если у вас есть набор из 10 закрытых членов, и вы хотите, чтобы получатель показал 5, вы должны написать __get()
, чтобы при вызове одного из псевдо-видимых членов вы отправляли его. В противном случае вы либо выдаете ошибку (которая в противном случае возникнет естественным образом без __get()
, либо вернете значение, такое как null
, которое на самом деле может оказаться бесполезным.
Я должен изгнать любого, кто вообще предлагает использовать геттеры и сеттеры. Это обычно указывает на проблему с архитектурой. Объясните концептуальную разницу между двумя следующими блоками кода, например:
class _ {
public $_;
}
против
class _ {
private $_;
public function get_() {
return $this->_;
}
}
Разницы нет.
Однако многие отмечают, что преимущество наличия геттера заключается в том, что это позволяет вам прозрачным образом изменить возвращаемое значение, чтобы сделать его полезным для получателя. Однако мы возвращаемся к проблемам архитектуры. Вы никогда не должны раскрывать содержание класса по какой-либо причине. Вместо этого вы должны сказать классу выполнить действие (которое может варьироваться в зависимости от его состояния). Использование геттеров обычно позволяет запрашивать состояние класса и выполнять внешние действия в зависимости от состояния просмотра.
У меня по существу те же аргументы против __set()
и сеттеров, но есть одна приятная вещь, которую __set()
позволяет вам сделать:
class _ {
private $_ = array();
public function __set($key, $val) {
$this->_[$key] = $val;
}
}
Это позволяет вам набрать очень хороший $_obj->key = 'val'
. Обратите внимание, что нет большой разницы от этого и добавление другого метода, такого как add()
, который принимает ключ и значение и делает то же самое, я просто предпочитаю нотацию установки объекта.