Если у меня есть класс "человек" с $name свойства и его методом считывания (get_name ()) и метод set (set_name ()) методы, то после инстанцирования объектов и установки свойства т.е.
$paddy = new person();
$paddy->set_name("Padyster Dave");
echo "Paddy's full name: ".$paddy->name; //WHY THIS IS NOT RECOMMENDED...
В вышеупомянутом коде $paddy->name;
ПОЧЕМУ ЭТО НЕ РЕКОМЕНДУЕТСЯ
Править
Выше кода пример кода, не присваивая accessifiers.. Его только для понимания $paddy-> называют понятие
Потому что однажды вы можете избавиться от члена $ name
, заменив его (например) $ first_name
, $ last_name
и метод fullname ()
(не то чтобы это хорошая идея ). Конечно, с __ get
и __ set
это не имеет большого значения.
В общем, установка свойства может быть не такой простой задачей, как сохранение значения. Предоставление прямого доступа к полям-членам может привести к тому, что другие функции будут вызывать несогласованное состояние объекта. Представьте, что вы храните массив, который должен оставаться отсортированным; если бы массив был общедоступным, что-то еще могло присвоить полю несортированный массив.
Открытие публичных полей было бы плохой привычкой. Из хорошей статьи о принципах объектно-ориентированного программирования в PHP
Если что-то изменится с объектом, любой код, который использует его тоже нужно изменить. Например, если имя человека, его семья и другие имена должны быть инкапсулированы в объект PersonName, вам нужно будет изменить весь свой код, чтобы учесть это изменение.
Странно то, что у вас есть сеттер, но вы оставляете свойство общедоступным
. (Предполагая, что не происходит магии __ get
.)
Обычно вы хотите использовать геттеры / сеттеры, чтобы получить больший контроль над тем, что можно назначить свойству, а что нет. Или вы можете захотеть выполнить код при обращении к свойству или его изменении. В любом случае вы должны принудительно использовать геттеры / сеттеры, сделав свойство частным
или защищенным
, иначе это бессмысленно. Речь идет о том, чтобы не дать себе или другим, которые будут использовать класс, стрелять собственной ногой.
Если сеттер в вашем примере устанавливает только значение, ничего не делая, это излишне.Если он делает что-то еще, что требуется всякий раз, когда значение устанавливается, у вас есть недостаток в дизайне вашего класса, поскольку можно изменить значение без использования установщика.
class Foo {
public $bar = 0; // is only allowed to contain numeric values
public function setBar($val) {
if (is_numeric($val)) {
$this->bar = $val;
}
}
}
$obj = new Foo();
$obj->bar = 'some value'; // set a string, which is not allowed
Если бы вы сделали $ bar
protected
, это было бы невозможно.
Очевидно, я тоже делаю «плохие» вещи, потому что использую такой код все время.
Но что, если $ this-> name (или, как я бы сделал, $ this-> nameFormatted) построено как:
protected var $name;
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast;
или что-то в этом роде.
Вы используете $ this-> name вне общедоступного контекста, но он по-прежнему создается в классе и, если он защищен, не будет перезаписан.
Или я упустил суть, и «плохая» вещь на самом деле заключается в том, чтобы указать имя в общедоступной области?