Модификаторы доступа 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 подробнее рассмотрим в следуюих уроках.
