Почему переменные-члены обычно являются частными?

Я только начал изучать объектно-ориентированное программирование сегодня, и только по наблюдению заметили, что во всех примерах переменные-члены являются частными. Почему так обычно бывает?

// Class class Building { // Object variables/properties private $number_of_floors = 5; // These buildings have 5 floors private $color; // Class constructor public function __construct($paint) { $this->color = $paint; } public function describe() { printf('This building has %d floors. It is %s in color.', $this->number_of_floors, $this->color ); } } 

Кроме того, если вы объявляете переменную-член публичной, каков синтаксис доступа к ней за пределами класса, в котором она была объявлена?

И, наконец, вам нужно добавлять «публичные» или «частные» к каждой переменной и функции внутри класса?

EDIT: Спасибо всем за ваши ответы, может ли кто-нибудь подтвердить, хотите ли вы добавлять «публичные» или «частные» к каждой переменной и функции внутри класса?

Благодаря!

Частные переменные не могут быть доступны извне, что дает вам контроль.

Но если вы поместите их в Public, вы можете получить к нему доступ

 $your_object_instance->Your_variable 

Например

 $building = new Building(); echo $building->number_of_floors; 

но вы должны поместить свою переменную number_of_floors в общедоступную, если вы хотите получить доступ к частному члену, тогда вам нужно реализовать новый метод в классе Building

 public function getNumberOfFloors() { return $this->number_of_floors; } 

поэтому ваш код должен выглядеть так

 $building = new Building(); echo $building->getNumberofFloors(); 

Правило большого пальца состоит в том, чтобы попытаться скрыть информацию как можно больше, разделив ее только тогда, когда это абсолютно необходимо.

  • Русские кодеры иногда говорят, что Общественный Морозов на ненужных модификаторах доступа, ссылаясь на рассказ о ненадлежащем раскрытии информации и о дальнейшем наказании, вызванном этим – Павлик Морозов :

13-летний мальчик, который осудил отца за власть и, в свою очередь, был убит его семьей …

Это облегчит вам кодирование и сделает вас менее склонными совершать ошибки. Идея состоит в том, что только класс может получить доступ к своим частным переменным, поэтому никакие другие классы в другом месте вашего кода не могут помешать и что-то испортить, изменив частные переменные неожиданным образом. Написание кода, подобного этому, с кучей автономных классов, взаимодействующих через небольшое количество строго контролируемых публичных методов, представляется более простым способом кодирования. Большие проекты намного легче понять, потому что они разбиты на куски размером с укусом.

Создание переменных private продолжает вызывать код в зависимости от деталей реализации вашего класса, поэтому вы можете изменить реализацию после этого, не нарушая код вызова.

Вы можете объявить более одной переменной в одной строке и использовать только один или несколько:

 private $number_of_floors = 5, $color; 

См. Также документы PHP « Классы и объекты ».

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

Тем не менее, аргументация для него в памяти, управляемой / мусорной сборке языков, заключается в том, что когда вы поддерживаете ссылку на объект, он не может быть собранным мусором и может вызвать утечку памяти.

Надеюсь это поможет!

Я действительно не знаю, как ответить на такой вопрос, но я описываю u наилучшим образом в соответствии с руководством по php

Видимость свойства или метода может быть определена путем префикса декларации ключевыми словами public, protected или private. К членам класса, объявленным публичными, можно получить доступ во всех странах. Доступ к элементам, объявленным защищенными, может быть доступен только внутри самого класса и наследуемых и родительских классов. Участникам, объявленным как private, может быть доступен только класс, определяющий участника.

Видимость собственности

Свойства класса должны быть определены как открытые, закрытые или защищенные. Если объявлено с использованием var, свойство будет определено как общедоступное.

 Methods declared without any explicit visibility keyword are defined as public. 

для получения дополнительной информации см. Видимость

Это означает, что свойства не могут быть непосредственно обработаны извне и, возможно, помещают объект в противоречивое состояние.

Одна из основ ООП заключается в том, что объект должен нести ответственность за сохранение своего собственного состояния и сохранение его внутренне согласованного, например, не позволяя свойства, которое предназначено только для того, чтобы удерживать положительные целые числа от -343.239 или убедиться, что внутренний массив правильно структурированы. Правильный способ сделать это – сделать невозможным прямое установление значений свойств снаружи. Сделав это свойство частным, вы запрещаете внешнему коду манипулировать им напрямую, заставляя его проходить через метод setter, который вы написали для задания. Этот сеттер может выполнять проверки того, что предлагаемое изменение не приведет объект в противоречивое состояние и не приведет к каким-либо изменениям.

Большинство книг и примеров, предназначенных для новичков, имеют тенденцию использовать очень простые объекты, поэтому может не иметь смысла, почему вам нужно пройти через все частные свойства и геттеры и сеттеры, но по мере увеличения сложности объекта все преимущества становятся все более очевидно. К сожалению, сложные объекты также не так хороши, как учебные пособия для начинающих, поэтому этот момент можно легко потерять вначале.