Перейти к основному содержимому

Модификаторы доступа в PHP

Модификатор доступа (его также называют ключевым словом видимости) определяет, откуда можно использовать свойство или метод.

В PHP их три:

  • public — доступен откуда угодно; это значение по умолчанию
  • protected — доступен внутри класса и внутри производных от него классов
  • private — доступен ТОЛЬКО внутри класса, в котором определён

Примечание: Если не указать модификатор, PHP считает свойство или метод public.


Модификатор доступа public

Если пометить свойство или метод как public, к нему сможет обратиться любой код, как внутри класса, так и снаружи.

В следующем примере код вне класса может использовать и свойство $name, и метод get_details().

Пример с public

Код вне класса задаёт публичное свойство и вызывает публичный метод:

Prompt
Напишите PHP-скрипт, который определяет класс Fruit с публичным свойством $name и публичным методом get_details(). Создайте объект Fruit, задайте его name напрямую и выведите его.
Вывод: PHP-скрипт

Модификатор доступа private

private — самый строгий модификатор: обратиться к такому свойству или методу может только код внутри класса, где они определены.

В следующем примере $name имеет модификатор private, поэтому прямое обращение к нему извне класса заканчивается неудачей.

Пример с private

Присваивание значения приватному свойству извне класса вызывает фатальную ошибку:

Prompt
Напишите PHP-скрипт, который определяет класс Fruit с приватным свойством $name. Создайте объект Fruit и попробуйте задать свойство name напрямую, чтобы показать, что это приводит к ошибке.
Вывод: PHP-скрипт

Модификатор доступа protected

protected находится посередине: доступ есть у самого класса и его производных классов (дочерних классов), но не у внешнего кода.

В следующем примере $name имеет модификатор protected, поэтому прямой доступ извне запрещён.

Пример с protected

Присваивание значения защищённому свойству извне класса вызывает фатальную ошибку:

Prompt
Напишите PHP-скрипт, который определяет класс Fruit с защищённым свойством $name. Создайте объект Fruit и попробуйте задать name напрямую, чтобы показать, что это приводит к ошибке.
Вывод: PHP-скрипт

protected и наследование

Дочерний класс может читать унаследованное защищённое свойство:

Prompt
Напишите PHP-скрипт, который определяет класс Fruit с защищённым свойством $name и методом setType(). Затем определите класс Apple, который наследует Fruit и имеет метод getType(). Покажите, что защищённое свойство доступно в дочернем классе.
Вывод: PHP-скрипт