PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


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




До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов. В этом уроке мы узнаем, как ограничить внутренний доступ к нашим классам с помощью модификаторов доступа private, protected и public.


С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В 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
?>

Результат выполнения кода:

Fatal error: Uncaught Error: Cannot access protected property Car::$color

Мы увидели, что у нас нет доступа к 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();
?>

Результат выполнения кода:

Модель автомобиля Mercedes benz

Нам нужны модификаторы доступа, чтобы ограничить возможность вносить изменения в методы и свойства извне классов. Как только мы определяем свойство или метод как приватные, только методы, находящиеся внутри класса, смогут приближаться к ним. Итак, чтобы взаимодействовать с приватными методами и свойствами, нам необходимо предоставить публичные методы. Внутри этих методов мы можем составить такую логику, которая сможет проверять и ограничивать данные, поступающие извне класса.

В следующем примере мы можем проверить, что только определенные модели автомобилей могут проложить себе дорогу и быть назначенными приватному свойству $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();
?>

Результат выполнения кода:

Марка автомобиля: Mercedes benz
Марка автомобиля: нет в нашем списке моделей!

Мы узнали о двух модификаторах доступа: public, который позволяет внешним функциям изменять код внутри класса, и private, который не позволяет любому коду извне класса изменять свойства и методы, которые он защищает. Мы увидели, что для изменения приватных методов и свойств мы можем использовать публичные методы, которые могут взаимодействовать с кодом извне области действия класса. Кликните здесь, чтобы попрактиковаться в предмете.

Модификатор protected подробнее рассмотрим в следуюих уроках.