Когда и почему я должен использовать public
, private
и protected
функции и переменные внутри класса? В чем разница между ними?
Примеры:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Ответы:
Ты используешь:
public
область действия, чтобы сделать это свойство / метод доступным из любого места, других классов и экземпляров объекта.private
область, когда вы хотите, чтобы ваше свойство / метод было видно только в его собственном классе.protected
область видимости, когда вы хотите сделать свое свойство / метод видимым во всех классах, которые расширяют текущий класс, включая родительский класс.Подробнее: (для полной информации)
источник
protected
область видимости, когда вы хотите сделать вашу переменную / функцию видимой во всех классах, которые расширяют текущий класс И его родительские классы .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Общественность:
Когда вы объявляете метод (функцию) или свойство (переменную) как
public
, к этим методам и свойствам можно получить доступ:Пример:
Защищено:
Когда вы объявляете метод (функцию) или свойство (переменную) как
protected
, эти методы и свойства могут быть доступныЧлены посторонних не могут получить доступ к этим переменным. «Посторонние» в том смысле, что они не являются объектными экземплярами самого объявленного класса.
Пример:
Точная ошибка будет такой:
Частный:
Когда вы объявляете метод (функцию) или свойство (переменную) как
private
, к этим методам и свойствам можно получить доступ:Члены посторонних не могут получить доступ к этим переменным. Аутсайдеры в том смысле, что они не являются объектными экземплярами самого объявленного класса и даже классов, которые наследуют объявленный класс.
Пример:
Точные сообщения об ошибках будут:
Рассекая класс дедушки с помощью отражения
Эта тема на самом деле не выходит за рамки, и я добавляю ее сюда, чтобы доказать, что рефлексия действительно мощная. Как я уже указано выше в трех примерах,
protected
иprivate
члены (свойства и методы) не могут быть доступны за пределами класса.Тем не менее, с отражением вы можете сделать экстраординарное , даже имея доступ
protected
иprivate
членов вне класса!Ну что такое отражение?
преамбула
У нас есть класс с именем
Grandpas
и говорят, что у нас есть три свойства. Для простоты рассмотрим три дедушки с именами:Давайте сделаем их (присвоение модификаторов)
public
,protected
иprivate
соответственно. Вы очень хорошо знаете, чтоprotected
иprivate
члены не могут быть доступны вне класса. Теперь давайте противоречим утверждению, используя отражение.Код
Вывод:
Распространенные заблуждения:
Пожалуйста, не путайте с приведенным ниже примером. Как вы все еще можете видеть, члены
private
иprotected
не могут быть доступны вне класса без использования отраженияВывод:
Функции отладки
print_r
,var_export
Иvar_dump
являются функциями отладчика . Они представляют информацию о переменной в удобочитаемой форме. Эти три функции выявятprotected
иprivate
свойства объектов с членами PHP 5. Статический класс не будет показано.Больше ресурсов:
источник
Обычно считается, что по умолчанию рекомендуется использовать минимальную видимость, поскольку это способствует инкапсуляции данных и хорошему дизайну интерфейса. При рассмотрении переменной члена и видимости метода подумайте о роли, которую член играет во взаимодействии с другими объектами.
Если вы «кодируете интерфейс, а не реализацию», то, как правило, довольно просто принимать решения о видимости. В общем случае переменные должны быть закрытыми или защищенными, если у вас нет веских причин для их раскрытия. Вместо этого используйте общедоступные методы доступа (методы получения / установки), чтобы ограничивать и регулировать доступ к внутренним элементам класса.
Чтобы использовать автомобиль в качестве аналогии, такие вещи, как скорость, передача и направление, будут частными переменными экземпляра. Вы не хотите, чтобы водитель непосредственно манипулировал такими вещами, как соотношение воздух / топливо. Вместо этого вы выставляете ограниченное количество действий в качестве открытых методов. Интерфейс автомобиля может включать в себя методы , такие как
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
и т.д.Водитель не знает и не должен заботиться о том, как эти действия реализуются внутренними частями автомобиля, и разоблачение этих функций может быть опасным для водителя и других людей на дороге. Отсюда хорошая практика разработки открытого интерфейса и инкапсуляции данных за этим интерфейсом.
Этот подход также позволяет вам изменять и улучшать реализацию открытых методов в вашем классе, не нарушая контракт интерфейса с клиентским кодом. Например, вы могли бы улучшить
accelerate()
метод, чтобы сделать его более экономичным, но использование этого метода останется прежним; клиентский код не потребует никаких изменений, но все же получит выгоду от вашего повышения эффективности.Изменить: так как кажется, что вы все еще находитесь в процессе изучения объектно-ориентированных концепций (которые гораздо сложнее освоить, чем синтаксис любого языка), я настоятельно рекомендую Мэтта Зандстры взять копию PHP Objects, Patterns и Practice . Эта книга впервые научила меня, как эффективно использовать ООП, а не просто научила меня синтаксису. Я выучил синтаксис много лет назад, но это было бесполезно без понимания «почему» ООП.
источник
private
- можно получить доступ только из классаprotected
- можно получить доступ из класса ВНУТРЕННЕГО классаpublic
- можно получить доступ из кода вне класса, а такжеЭто относится как к функциям, так и к переменным.
источник
Разница заключается в следующем:
Public
:: Публичная переменная или метод могут быть доступны напрямую любому пользователю класса.Protected
:: Защищенная переменная или метод не могут быть доступны пользователям класса, но могут быть доступны внутри подкласса, который наследуется от класса.Private
:: Доступ к закрытой переменной или методу возможен только из класса, в котором он определен. Это означает, что закрытая переменная или метод не могут быть вызваны из дочернего элемента, расширяющего класс.источник
Области видимости с абстрактными примерами :: Облегчает понимание
Эта видимость свойства или метода определяется предварительной фиксацией объявления одного из трех ключевых слов (Public, protected и private).
Открытый : если свойство или метод определен как открытый, это означает, что к нему можно обращаться как к объекту, так и к нему.
Защищенный: когда видимость свойства или метода настроена на защищенные члены, доступ может осуществляться только внутри самого класса и унаследованных и наследующих классов. (Унаследовано: - класс может иметь все свойства и методы другого класса).
Личный: когда видимость свойства или метода установлена на частный, только класс, имеющий закрытые члены, может получить доступ к этим методам и свойствам (внутри класса), независимо от того, какое отношение класса там существует.
источник
Извлеченный из :
http://php.net/manual/en/language.oop5.visibility.php
источник
PUBLIC
:public
область действия: открытая переменная / функция доступна как для объектов, так и для других классов.PROTECTED
:protected
Область действия: защищенная переменная / функция доступна для всех классов, расширяющих текущий класс.PRIVATE
:private
область действия: закрытая переменная / функция видна только в текущем классе, где она определяется.Прочитайте видимость метода или переменной в PHP Manual.
источник
Учитывая « когда »:
я склонен объявлять все как частное изначально, если я не совсем уверен. Причина в том, что обычно сделать публичный метод общедоступным гораздо проще, чем наоборот. Это потому, что вы, по крайней мере, можете быть уверены, что приватный метод не использовался нигде, кроме самого класса. Публичный метод уже может использоваться везде, возможно, требующий обширной переписывания.
Обновление : я использую стандартное значение по умолчанию
protected
, потому что я пришел к выводу, что он достаточно хорош для инкапсуляции и не мешает расширению классов (чего я стараюсь избегать в любом случае). Только если у меня будет веская причина использовать два других, я сделаю это.Хорошей причиной для
private
метода может быть тот, который реализует что-то, присущее этому объекту, что даже расширяющийся класс не должен изменяться (фактическая причина, в дополнение к инкапсуляции, как внутреннее управление состоянием). В конце концов, все еще достаточно легко отследить, гдеprotected
обычно используется метод, поэтому я по умолчанию использую его вprotected
настоящее время. Может быть, не 100% объективный опыт "в окопах", я признаю.источник
private
будет по-прежнему «достаточно хорошим» для использования, но вы не предлагаете, чтобы, хотя и более ранние причины, которые вы приводили, звучат как «хорошая причина»: инкапсуляция.protected
делает это уже, но вы сохраняете его гибким для расширения / наследования. Опять же, если у вас нет веских причин сделать этоprivate
.protected
самом деле просачиваются во внешнюю область и часто оказываются на вашем пути, поскольку поддерживают плохие проектные решения, такие как неявное одобрение наследования, в то время как лучше поддерживать композицию. Вот почему придерживаться частного, если у вас нет реальных требований, чтобы не часто это лучший способ начать писать код. Это также помешает принимать проектные решения слишком рано, пока они на самом деле еще не нужны.protected
не проникает во внешнюю область (код, который вызывает / обращается к методу / полю), а только во внутреннюю область (расширяющие классы). Есть разница, настолько незначительная, насколько это возможно для вас. Гораздо проще отследить использованиеprotected
поля, чемpublic
одного.Руководство по PHP хорошо прочитано здесь .
источник
Для меня это самый полезный способ понять три типа свойств:
Public : используйте это, когда у вас все в порядке с прямой доступ к этой переменной и ее изменение из любой точки вашего кода.
Пример использования извне класса:
Защищено : Используйте это, если вы хотите заставить других программистов (и вас самих) использовать методы получения / установки вне класса при доступе и установке переменных (но вы должны быть последовательными и использовать методы получения и установки также внутри класса). Это или,
private
как правило, способ по умолчанию, вы должны установить все свойства класса.Почему? Потому что, если вы решите в какой-то момент в будущем (возможно, даже через 5 минут), что вы хотите манипулировать значением, возвращаемым для этого свойства, или делать что-то с ним перед получением / установкой, вы можете сделать это без рефакторинга везде, где есть использовал его в своем проекте.
Пример использования извне класса:
Частный :
private
свойства очень похожи наprotected
свойства. Но отличительной особенностью / различием является то, что его созданиеprivate
также делает его недоступным для дочерних классов без использования метода получения или установки родительского класса.Таким образом, в основном, если вы используете методы получения и установки для свойства (или если оно используется только внутри родительского класса и не предназначено для того, чтобы быть доступным где-либо еще), вы могли бы также сделать это
private
, просто чтобы никто не пытался использовать его напрямую и вносить ошибки .Пример использования внутри дочернего класса (который расширяет MyObject):
источник
Они там, чтобы учесть разные уровни инкапсуляции
источник
Переменные в PHP преобразуются в три разных типа:
Public: значения этих типов переменных доступны во всей области видимости и требуют выполнения вашего кода. объявить как:
public $examTimeTable;
Private: значения этого типа переменных доступны только для класса, к которому он принадлежит.
private $classRoomComputers;
Защищено: значения этого класса только и доступны только тогда, когда доступ был предоставлен в форме наследования или их дочернего класса. обычно используется
::
для предоставления доступа по родительскому классуprotected $familyWealth;
источник
Возрождаем старый вопрос, но я думаю, что действительно хороший способ подумать об этом с точки зрения API, который вы определяете.
public
- Все, что помечено как public, является частью API, который любой, кто использует ваш класс / интерфейс / другой, будет использовать и полагаться на него.protected
- Не обманывайте себя, это тоже часть API! Люди могут создавать подклассы, расширять ваш код и использовать все, что помечено как защищенное.private
- Частные свойства и методы могут быть изменены так, как вам нравится. Никто другой не может использовать их. Это единственное, что вы можете изменить, не внося серьезных изменений.Или в терминах Semver :
Изменения во что-либо
public
илиprotected
должны рассматриваться как ОСНОВНЫЕ изменения.Что-нибудь новое
public
илиprotected
должно быть (по крайней мере) МЕНЬШЕprivate
ПАТЧ может быть только новый / изменения чего-либоТаким образом, с точки зрения поддержки кода, хорошо быть осторожным с тем, что вы делаете,
public
илиprotected
потому, что это то, что вы обещаете своим пользователям.источник
Когда мы следуем объектно-ориентированному php в нашем проекте, мы должны следовать некоторым правилам, чтобы использовать модификаторы доступа в php. Сегодня мы собираемся ясно узнать, что такое модификатор доступа и как мы можем его использовать. Модификаторы доступа PHP используются для установки прав доступа с классами PHP и их членами, которые являются функциями и переменными, определенными в области видимости класса. В php есть три области для учеников.
Теперь давайте посмотрим на следующее изображение, чтобы понять уровень доступа модификатора доступа
Теперь давайте взглянем на следующий список, чтобы узнать о возможных ключевых словах PHP, используемых в качестве модификаторов доступа.
public: - класс или его члены, определенные с помощью этого модификатора доступа, будут публично доступны из любой точки мира, даже вне области действия класса.
private: - члены класса с этим ключевым словом будут доступны внутри самого класса. мы не можем получить доступ к личным данным из подкласса. Он защищает членов от доступа извне класса.
protected: - то же самое как private, за исключением того, что позволяет подклассам получать доступ к защищенным членам суперкласса.
Теперь посмотрите таблицу, чтобы понять модификатор доступа. Читать статью php access modifire.
источник
Public
: является состоянием по умолчанию, когда вы объявляете переменную или метод, доступ к чему-либо непосредственно к объекту.Protected
Доступ к ним возможен только внутри объекта и подклассов.Private
: Может указываться только внутри объекта, а не подклассов.источник
Упомянутые ключевые слова являются модификаторами доступа и помогают нам реализовать инкапсуляцию (или скрытие информации). Они сообщают компилятору, какие другие классы должны иметь доступ к определенному полю или методу.
private - только текущий класс будет иметь доступ к полю или методу.
protected - только текущий класс и подклассы (а иногда и классы одного пакета) этого класса будут иметь доступ к полю или методу.
public - любой класс может ссылаться на поле или вызывать метод.
источник