Menu
Coddy logo textTech

Приватные и защищенные свойства

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 18 из 91.

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

Свойство private может быть доступно только из того класса, в котором оно определено:

<?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 напрямую извне класса вызовет ошибку. Это защищает баланс от изменения без использования метода 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, когда только определяющий класс должен иметь доступ к свойству. Используйте protected, когда дочерним классам также нужен доступ. Оба варианта предотвращают прямой внешний доступ, сохраняя внутреннее состояние вашего объекта в безопасности.

challenge icon

Задание

Легко

Давайте создадим безопасную систему управления сотрудниками, которая демонстрирует, как защитить конфиденциальные данные с помощью свойств private и protected.

Вы создадите три файла, которые работают вместе для управления информацией о сотрудниках с надлежащим контролем доступа:

  • Employee.php — Определите класс Employee, который служит базой для всех сотрудников. Он должен иметь свойство protected $name (чтобы дочерние классы могли получить к нему доступ) и свойство private $salary (только этот класс должен напрямую изменять зарплату). Конструктор принимает имя и зарплату, устанавливая оба свойства. Добавьте публичный метод getName(), который возвращает имя, публичный метод getSalary(), который возвращает зарплату, и публичный метод giveRaise($amount), который увеличивает зарплату на заданную сумму.
  • Manager.php — Определите класс Manager, который расширяет Employee. Подключите файл Employee в начале. Добавьте приватное свойство $department. Конструктор должен принимать имя, зарплату и отдел — вызовите родительский конструктор с помощью parent::__construct($name, $salary), затем установите отдел. Создайте метод getDetails(), который возвращает "[name] manages [department]", обращаясь к защищенному свойству $name напрямую. Также добавьте метод getDepartment(), который возвращает название отдела.
  • main.php — Подключите оба файла классов. Создайте объект Manager с именем "Sarah", зарплатой 75000 и отделом "Engineering". Выведите детали менеджера с помощью getDetails(). Затем дайте менеджеру прибавку в 5000 и выведите его новую зарплату с помощью getSalary(). Каждый вывод должен быть на отдельной строке.

Обратите внимание, как класс Manager может напрямую обращаться к защищенному свойству $name, но должен использовать метод getSalary() для доступа к приватной зарплате. Это демонстрирует ключевое различие между видимостью protected и private — protected разрешает доступ дочерним классам, в то время как private сохраняет данные по-настоящему скрытыми.

Попробуйте сами

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Создайте объект Manager с именем "Sarah", зарплатой 75000 и отделом "Engineering"

// TODO: Выведите данные менеджера, используя getDetails()

// TODO: Увеличьте зарплату менеджера на 5000

// TODO: Выведите новую зарплату, используя getSalary()
?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование