Почему свойство Directly Accesing не рекомендуется в ООП PHP?

Если у меня есть класс "человек" с $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-> называют понятие

7
задан OM The Eternity 22 April 2010 в 05:55
поделиться

4 ответа

Потому что однажды вы можете избавиться от члена $ name , заменив его (например) $ first_name , $ last_name и метод fullname () (не то чтобы это хорошая идея ). Конечно, с __ get и __ set это не имеет большого значения.

В общем, установка свойства может быть не такой простой задачей, как сохранение значения. Предоставление прямого доступа к полям-членам может привести к тому, что другие функции будут вызывать несогласованное состояние объекта. Представьте, что вы храните массив, который должен оставаться отсортированным; если бы массив был общедоступным, что-то еще могло присвоить полю несортированный массив.

6
ответ дан 6 December 2019 в 11:47
поделиться

Открытие публичных полей было бы плохой привычкой. Из хорошей статьи о принципах объектно-ориентированного программирования в PHP

Если что-то изменится с объектом, любой код, который использует его тоже нужно изменить. Например, если имя человека, его семья и другие имена должны быть инкапсулированы в объект PersonName, вам нужно будет изменить весь свой код, чтобы учесть это изменение.

3
ответ дан 6 December 2019 в 11:47
поделиться

Странно то, что у вас есть сеттер, но вы оставляете свойство общедоступным . (Предполагая, что не происходит магии __ 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 , это было бы невозможно.

8
ответ дан 6 December 2019 в 11:47
поделиться

Очевидно, я тоже делаю «плохие» вещи, потому что использую такой код все время.

Но что, если $ this-> name (или, как я бы сделал, $ this-> nameFormatted) построено как:

protected var $name;
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast;

или что-то в этом роде.

Вы используете $ this-> name вне общедоступного контекста, но он по-прежнему создается в классе и, если он защищен, не будет перезаписан.

Или я упустил суть, и «плохая» вещь на самом деле заключается в том, чтобы указать имя в общедоступной области?

0
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

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