Модификаторы доступа public и private в PHP
Ключевое слово public
, которое мы
пишем перед именами указывает на то, что
данные свойства и методы доступны извне (вне
кода класса). В противоположность ключевое
слово private
, которое указывает на
то, что свойства и методы недоступны извне.
Зачем это надо? К примеру, у нас есть класс, реализующий некоторый функционал. Есть набор методов, но часть этих методов является вспомогательными.
Будет лучше, чтобы эти вспомогательные методы нельзя было использовать вне нашего класса. В этом случае мы легко сможем поредактировать код этих вспомогательных методов и будем уверенными в том, что их снаружи никто не использует и ничего страшного не случится.
Такой подход называется инкапсуляцией - все лишнее не должно быть доступно извне, в этом случае жизнь программиста станет проще.
То же самое касается и свойств. Некоторые свойства выполняют чисто вспомогательную функцию и не должны быть доступны вне класса, иначе мы их можем случайно поменять снаружи и сломать работу нашего кода.
Методы и свойства, которые мы хотим сделать
недоступными извне, называются приватными
и объявляются с помощью ключевого слова private
.
Давайте попробуем - объявим свойства $name
и $age
приватными и попытаемся обратиться
к ним снаружи - мы сразу увидим ошибку:
<?php
class User
{
private $name;
private $age;
}
$user = new User;
// Выдаст ошибку, так как свойство name - private:
$user->name = 'john';
?>
Применим на практике
Давайте посмотрим на класс User
, который
мы сделали в предыдущем уроке:
<?php
class User
{
public $name;
public $age;
// Метод для проверки возраста:
public function isAgeCorrect($age)
{
return $age >= 18 and $age <= 60;
}
// Метод для изменения возраста юзера:
public function setAge($age)
{
// Проверим возраст на корректность:
if ($this->isAgeCorrect($age)) {
$this->age = $age;
}
}
// Метод для добавления к возрасту:
public function addAge($years)
{
$newAge = $this->age + $years; // вычислим новый возраст
// Проверим возраст на корректность:
if ($this->isAgeCorrect($newAge)) {
$this->age = $newAge; // обновим, если новый возраст прошел проверку
}
}
}
?>
Как мы знаем, метод isAgeCorrect
является
вспомогательным и мы не планируем использовать
его снаружи класса. Логично сделать его приватным,
чтобы другой программист, который будет потом
работать над нашим проектом (или мы сами
через некоторое время) случайно не использовал
этот метод снаружи класса.
Сделаем это:
<?php
class User
{
public $name;
public $age;
// Объявим приватным:
private function isAgeCorrect($age)
{
return $age >= 18 and $age <= 60;
}
// Метод для изменения возраста юзера:
public function setAge($age)
{
// Проверим возраст на корректность:
if ($this->isAgeCorrect($age)) {
$this->age = $age;
}
}
// Метод для добавления к возрасту:
public function addAge($years)
{
$newAge = $this->age + $years; // вычислим новый возраст
// Проверим возраст на корректность:
if ($this->isAgeCorrect($newAge)) {
$this->age = $newAge; // обновим, если новый возраст прошел проверку
}
}
}
?>
Обычно все приватные методы размещают в конце класса, давайте перенесем наш метод в самый низ:
<?php
class User
{
public $name;
public $age;
// Метод для изменения возраста юзера:
public function setAge($age)
{
// Проверим возраст на корректность:
if ($this->isAgeCorrect($age)) {
$this->age = $age;
}
}
// Метод для добавления к возрасту:
public function addAge($years)
{
$newAge = $this->age + $years; // вычислим новый возраст
// Проверим возраст на корректность:
if ($this->isAgeCorrect($newAge)) {
$this->age = $newAge; // обновим, если новый возраст прошел проверку
}
}
// Метод для проверки возраста:
private function isAgeCorrect($age)
{
return $age >= 18 and $age <= 60;
}
}
?>
Существует специальное правило: если вы делаете новый метод и не знаете, сделать его публичным или приватным, - делайте приватным. В дальнейшем, если он понадобится снаружи, - вы поменяете его на публичный.
Еще раз резюмируем: слова public
и
private
не нужны для реализации логики
программы, а нужны для того, чтобы уберечь
программистов от ошибок.
Не подсматривая в мой код внесите такие же
правки в класс User
.
Попробуйте вызвать метод isAgeCorrect
снаружи класса. Убедитесь, что это будет
вызывать ошибку.
Сделайте класс Student
со свойствами
$name
и $course
(курс студента,
от 1
-го до 5
-го).
В классе Student
сделайте public
метод transferToNextCourse
, который
будет переводить студента на следующий курс.
Выполните в методе transferToNextCourse
проверку на то, что следующий курс не больше
5
.
Вынесите проверку курса в отдельный private
метод isCourseCorrect
.