Приватные и защищённые свойства
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 18 из 91.
До сих пор мы использовали свойства public, к которым можно получить доступ откуда угодно. Но иногда необходимо ограничить доступ, чтобы защитить ваши данные. PHP предоставляет ещё два модификатора видимости: private и protected.
К свойству private property можно получить доступ только изнутри class, которая его определяет:
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();
Вывод:
100Попытка получить доступ к $account->balance directly извне class вызовет ошибку. Это защищает balance от изменения без прохождения через метод deposit.
Свойство protected работает аналогично, но к нему также могут обращаться дочерние классы, которые расширяют родительский класс:
<?php
class User {
protected $email;
public function __construct($email) {
$this->email = $email;
}
}
class Admin extends User {
public function showEmail() {
return $this->email;
}
}
$admin = new Admin("admin@example.com");
echo $admin->showEmail();
Вывод:
admin@example.comКлючевой момент: Используй private, когда только определяющий class должен иметь доступ к property. Используй protected, когда доступ также нужен дочерним классам. Оба модификатора предотвращают прямой внешний доступ, обеспечивая безопасность внутреннего состояния твоего объекта.
Задание
ЛегкоДавайте создадим безопасную систему управления сотрудниками, демонстрирующую, как защищать конфиденциальные данные с помощью свойств private и protected.
Вы создадите три файла, которые будут работать вместе для управления информацией о сотрудниках с надлежащим контролем доступа:
Employee.php: DefineEmployeeclass, который служит базовым для всех сотрудников. В нём должны быть свойствоprotected $name(чтобы дочерние классы могли получить к нему доступ) и свойствоprivate $salary(только этот class должен напрямую изменять зарплаты). constructor accepts имя и зарплату, устанавливая оба свойства. Добавьте publicgetName()method, который returns имя, publicgetSalary()method, который returns зарплату, и publicgiveRaise($amount)method, который увеличивает зарплату на указанную сумму.Manager.php: DefineManagerclass, который extendsEmployee. Подключите файл Employee в верхней части. Добавьте private свойство$department. constructor должен accepts имя, зарплату и department: call parent constructor с помощьюparent::__construct($name, $salary), затем установите department. Create methodgetDetails(), который returns"[name] manages [department]", обращаясь к protected свойству$namedirectly. Также добавьте methodgetDepartment(), который returns department.main.php: Подключите оба файла с class. CreateManagerс именем"Sarah", зарплатой75000и department"Engineering". Выведите details manager с помощьюgetDetails(). Затем увеличьте зарплату manager на5000и выведите новую зарплату с помощьюgetSalary(). Каждый результат должен находиться на отдельной строке.
Обратите внимание, как Manager class может напрямую получить доступ к protected свойству $name, но должен использовать method getSalary() для доступа к private зарплате. Это демонстрирует ключевое различие между видимостью protected и private: protected разрешает доступ дочернему class, тогда как private действительно скрывает данные.
Попробуйте сами
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: Создайте Manager с именем "Sarah", зарплатой 75000 и отделом "Engineering"
// TODO: Выведите данные менеджера с помощью getDetails()
// TODO: Дайте менеджеру повышение на 5000
// TODO: Выведите новую зарплату с помощью getSalary()
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP