Модификаторы доступа PHP
До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов. В этом уроке мы узнаем, как ограничить внутренний доступ к нашим классам с помощью модификаторов доступа private, protected и public.
Модификаторы доступа в PHP
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
-
public
— свойство или метод доступны отовсюду. Это значение по умолчанию -
protected
— к свойству или методу можно получить доступ внутри класса и классов, производных от этого класса -
private
— свойство или метод могут быть доступны ТОЛЬКО внутри класса
В следующем примере мы добавили три разных модификатора доступа к трем свойствам класса Car
. Здесь, если мы попытаемся установить свойство name
, то оно будет работать нормально (поскольку свойство name
является общедоступным). Однако, если мы попытаемся установить свойство color
или disk
, это приведет к фатальной ошибке (поскольку свойства color
и disk
являются соответственно protected
(защищенным) и private
(приватным)):
Пример
Попробуй сам »<?php
class Car {
public $name;
protected $color;
private $disk;
}
$bmv = new Car();
$bmv->name = 'BMV'; // OK
$bmv->color = 'Yellow'; // ERROR
$bmv->disk = 'Stamped'; // ERROR
?>
Результат выполнения кода:
Как получить доступ к свойству private?
Мы увидели, что у нас нет доступа к private
(приватным) свойствам извне класса, но нам все равно нужно каким-то образом установить и получить значения свойств. Для взаимодействия с приватными свойствами мы используем публичные (public) методы, потому что они могут взаимодействовать как с кодом за пределами области действия класса, так и с кодом внутри класса. Публичные методы, которые могут взаимодействовать таким образом, обычно делятся на два типа:
- Сеттеры — методы устанавливающие значения приватных свойств.
- Геттеры — методы, которые получают значения частных свойств.
В следующем примере мы сможем получить и установить значение приватного свойства $carModel
с помощью методов setter
и getter
. Мы будем использовать метод setModel()
, чтобы установить значение модели автомобиля, и метод getModel()
, чтобы получить значение свойства:
Пример
Попробуй сам »<?php
class Car {
//модификатор private запрещает доступ к методу за пределами класса
private $model;
//модификатор публичного доступа разрешает доступ к методу извне класса
public function setModel($model) {
$this -> model = $model;
}
public function getModel() {
return "Модель автомобиля " . $this -> model;
}
}
$mercedes = new Car();
//Устанавливает модель автомобиля
$mercedes -> setModel("Mercedes benz");
//Получает модель автомобиля
echo $mercedes -> getModel();
?>
Результат выполнения кода:
Зачем нужны модификаторы доступа?
Нам нужны модификаторы доступа, чтобы ограничить возможность вносить изменения в методы и свойства извне классов. Как только мы определяем свойство или метод как приватные, только методы, находящиеся внутри класса, смогут приближаться к ним. Итак, чтобы взаимодействовать с приватными методами и свойствами, нам необходимо предоставить публичные методы. Внутри этих методов мы можем составить такую логику, которая сможет проверять и ограничивать данные, поступающие извне класса.
В следующем примере мы можем проверить, что только определенные модели автомобилей могут проложить себе дорогу и быть назначенными приватному свойству $model
, путем определения разрешенных альтернатив для моделей в публичном методе setModel()
. Для этого мы определяем внутри метода setModel()
массив разрешенных моделей автомобилей и проверяем, что только эти модели присвоены свойству $model
.
Пример
Попробуй сам »<?php
class Car {
//модификатор private запрещает доступ к методу за пределами класса
private $model;
//модификатор публичного доступа разрешает доступ к методу извне класса
public function setModel($model) {
//устанавливаем, что только определенные модели автомобилей могут быть назначены свойству $carModel
$allowedModels = array("Mercedes benz","BMW");
if(in_array($model,$allowedModels)) {
$this -> model = $model;
} else {
$this -> model = "нет в нашем списке моделей!";
}
}
public function getModel() {
return "Марка автомобиля: " . $this -> model;
}
}
$mercedes = new Car();
$vaz = new Car();
//Устанавливает модель автомобиля
$mercedes -> setModel("Mercedes benz");
$vaz -> setModel("VAZ");
//Получает модель автомобиля
echo $mercedes -> getModel();
echo "<br>";
echo $vaz -> getModel();
?>
Результат выполнения кода:
Марка автомобиля: нет в нашем списке моделей!
Заключение
Мы узнали о двух модификаторах доступа: public
, который позволяет внешним функциям изменять код внутри класса, и private
, который не позволяет любому коду извне класса изменять свойства и методы, которые он защищает. Мы увидели, что для изменения приватных методов и свойств мы можем использовать публичные методы, которые могут взаимодействовать с кодом извне области действия класса. Кликните здесь, чтобы попрактиковаться в предмете.
Модификатор protected
подробнее рассмотрим в следуюих уроках.