protected php что это
Модификаторы доступа в PHP
В PHP имеется три модификатора доступа:
Начнём с модификатора доступа public. Данный модификатор означает, что свойство, метод или конструктор будут доступны для всех объектов, которые их используют.
Модификатор доступа protected означает, что данный элемент объекта может быть использован только в самом объекте, а также в его дочерних.
И, наконец, модификатор доступа private означает, что данный элемент объекта может быть использован только в самом объекте и нигде больше.
Давайте продолжим заниматься классами по автомобилям и реализуем их заново, но с использованием модификаторов доступа. Напоминаю, что раньше мы использовали только public, что не есть хорошо. Итак, абстрактный класс, отвечающий за «Автомобиль«:
Как видите, мы сделали свойства объекта Car защищёнными (protected), то есть они теперь доступны только внутри самого класса Car, а также во всех его наследниках. Также мы закрыли служебную функцию sound(), сделав её также protected. Всё остальное (конструктор и метод move()) мы оставили открытыми, то есть public. Иногда всё-таки бывает нужно иметь доступ к свойствам, однако, делать их открытыми совсем не хочется. Тогда добавляют так называемые методы get и set:
Таким образом, мы теперь можем спокойно получать полный доступ ко всем свойствам на чтение и на запись.
Теперь класс «Auto«, отвечающий за легковой автомобиль:
Здесь мы поменяли модификатор доступа только у метода sound().
И, наконец, скрипт, который использует объект Auto.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 21 ):
Сразу в поля записать то, что в GET не получится. Но можно вручную это сделать. То есть принять массив и сразу его значения раскидать по полям. А уже потом обычными методами вытаскивать эти значения из полей.
Ясно, а если делать для каждого поля свой метод, это не сильно скажется на быстродействии?
На быстродействие это практически не повлияет.
В чем разница между public, protected и private доступом?
Примеры:
public function doSomething() <
private function doSomething() <
protected function doSomething() <
Ответ 1
public область видимости используется, чтобы сделать это свойство/метод доступным из любого места, других классов и экземпляров объекта.
private область видимости, если необходимо, чтобы ваше свойство/метод было видно только в его собственном классе.
Если вы не используете модификатор видимости, свойство/метод будут общедоступными.
Ответ 2
Public:
Тот же класс, который его объявил.
Классы, наследующие объявленный выше класс.
Любые внешние элементы вне этого класса также могут получить доступ к ним.
Пример:
class Daddy extends GrandPa <
// Public переменная, которая доступна также из внешнего класса!
$outsiderWantstoKnowGrandpasName = new GrandPa;
Protected:
Тот же класс, который его объявил.
Классы, наследующие объявленный выше класс.
Внешние члены не могут получить доступ к этим переменным. «Внешние» в том смысле, что они не являются экземплярами объекта самого объявленного класса.
Пример:
class Daddy extends GrandPa <
$outsiderWantstoKnowGrandpasName = new GrandPa;
Точная ошибка будет такой:
Private:
Тот же класс, который его объявил.
Внешние члены не могут получить доступ к этим переменным. «Внешние» в том смысле, что они не являются экземплярами объекта самого объявленного класса и даже не являются классами, наследующими объявленный класс.
Пример:
class Daddy extends GrandPa<
$outsiderWantstoKnowGrandpasName = new GrandPa;
Сообщения об ошибках будут следующими:
Примечание: Неопределенное свойство: Daddy::$name
Неустранимая ошибка: невозможно получить доступ к частному свойству GrandPa::$name
Ответ 3
Обычно хорошей практикой считается установка по умолчанию минимальной требуемой видимости, поскольку это способствует инкапсуляции данных и хорошему дизайну интерфейса. При рассмотрении переменной-члена и видимости метода подумайте о роли, которую член играет во взаимодействии с другими объектами.
Если вы «кодируете интерфейс, а не реализацию», то обычно довольно просто принимать решения о видимости. В общем, переменные должны быть закрытыми или защищенными, если у вас нет веских причин для их раскрытия. Вместо этого используйте общедоступные методы доступа (геттеры/сеттеры) для ограничения и регулирования доступа к внутренним компонентам класса.
Водитель не знает и не должен заботиться о том, как эти действия реализуются внутренними компонентами автомобиля, и раскрытие этой функции может быть опасно для водителя и других людей на дороге. Следовательно, хорошая практика разработки общедоступного интерфейса и инкапсуляции данных за этим интерфейсом.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Область видимости
Область видимости свойства или метода может быть определена путем использования следующих ключевых слов в объявлении: public, protected или private. Доступ к свойствам и методам класса, объявленным как public (общедоступный), разрешен отовсюду. Модификатор protected (защищенный) разрешает доступ наследуемым и родительским классам. Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.
Область видимости свойства
Свойства класса должны быть определены через модификаторы public, private, или protected. Если же свойство определено с помощью var, то оно будет доступно как public свойство.
Пример #1 Объявление свойства класса
Область видимости метода
Методы класса должны быть определены через модификаторы public, private, или protected. Методы, где определение модификатора отсутствует, определяются как public.
Пример #2 Объявление метода
// Объявление общедоступного метода
public function MyPublic ()
// Объявление защищенного метода
protected function MyProtected ()
// Объявление закрытого метода
private function MyPrivate ()
public function testPublic () <
echo «Bar::testPublic\n» ;
>
private function testPrivate () <
echo «Bar::testPrivate\n» ;
>
>
class Foo extends Bar
<
public function testPublic () <
echo «Foo::testPublic\n» ;
>
private function testPrivate () <
echo «Foo::testPrivate\n» ;
>
>
Видимость из других объектов
Объекты одного типа имеют доступ к элементам с модификаторами private и protected друг друга, даже если не являются одним и тем же экземпляром. Это объясняется тем, что реализация видимости элементов известна внутри этих объектов.
Пример #3 Доступ к элементам с модификатором private из объектов одного типа
private function bar ()
<
echo ‘Доступ к закрытому методу.’ ;
>
$test = new Test ( ‘test’ );
Модификаторы доступа PHP
До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов. В этом уроке мы узнаем, как ограничить внутренний доступ к нашим классам с помощью модификаторов доступа private, protected и public.
Модификаторы доступа в PHP
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
Пример
Результат выполнения кода:
Как получить доступ к свойству private?
Мы увидели, что у нас нет доступа к private (приватным) свойствам извне класса, но нам все равно нужно каким-то образом установить и получить значения свойств. Для взаимодействия с приватными свойствами мы используем публичные (public) методы, потому что они могут взаимодействовать как с кодом за пределами области действия класса, так и с кодом внутри класса. Публичные методы, которые могут взаимодействовать таким образом, обычно делятся на два типа:
Пример
Результат выполнения кода:
Зачем нужны модификаторы доступа?
Нам нужны модификаторы доступа, чтобы ограничить возможность вносить изменения в методы и свойства извне классов. Как только мы определяем свойство или метод как приватные, только методы, находящиеся внутри класса, смогут приближаться к ним. Итак, чтобы взаимодействовать с приватными методами и свойствами, нам необходимо предоставить публичные методы. Внутри этих методов мы можем составить такую логику, которая сможет проверять и ограничивать данные, поступающие извне класса.
Пример
Результат выполнения кода:
Заключение
Модификатор protected подробнее рассмотрим в следуюих уроках.
PHP: Наследование
Наследование
Класс, который получается в результате наследования от другого, называется подклассом. Эту связь обычно описывают с помощью терминов «родительский» и «дочерний». Дочерний класс происходит от родительского и наследует его характеристики: свойства и методы. Обычно в подклассе к функциональности родительского класса (который также называют суперклассом) добавляются новые функциональные возможности.
Обратите внимание на то, что в подклассах могут переопределяться свойства и методы. Определяя подкласс, мы гарантируем, что его экземпляр определяется характеристиками сначала дочернего, а затем родительского класса. Чтобы лучше это понять рассмотрим пример:
Так как мы уже рассмотрели тему про указание типа аргументов, осталось сказать о том, что если в качестве типа указан родительский класс, то все потомки для метода будут так же доступны для использования, посмотрите на следующий пример:
Оператор parent
На практике подклассам бывает необходимо расширить функциональность методов родительского класса. Расширяя функциональность за счет переопределения методов суперкласса, в подклассах вы сохраняете возможность сначала выполнить программный код родительского класса, а затем добавить код, который реализует дополнительную функциональность. Давайте разберем как это можно сделать.
Эта конструкция вызовет метод, определенный в суперклассе. Вслед за таким вызовом можно поместить свой программный код, который добавит новую функциональность:
Когда в дочернем классе определяется свой конструктор, PHP не вызывает конструктор родительского класса автоматически. Это необходимо сделать вручную в конструкторе подкласса. Подкласс сначала в своем конструкторе вызывает конструктор своего родительского класса, передавая нужные аргументы для инициализации, исполняет его, а затем выполняется код, который реализует дополнительную функциональность, в данном случае инициализирует свойство подкласса.
Ключевое слово parent можно использовать не только в конструкторах, но и в любом другом методе, функциональность которого вы хотите расширить, достигнуть этого можно, вызвав метод родительского класса:
Здесь сначала вызывается метод getstr() из суперкласса, значение которого присваивается переменной, а после этого выполняется остальной код определенный в методе подкласса.
Теперь, когда мы познакомились с основами наследования, можно, наконец, рассмотреть вопрос видимости свойств и методов.
public, protected и private: управление доступом
До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов.
Элементы класса можно объявлять как public (общедоступные), protected (защищенные) и private (закрытые). Рассмотрим разницу между ними:
Модификатор protected с точки зрения вызывающей программы выглядит точно так же, как и private : он запрещает доступ к данным объекта извне. Однако в отличие от private он позволяет обращаться к данным не только из методов своего класса, но также и из методов подкласса.