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. Конструктор должен принимать имя, зарплату и отдел — вызовите родительский конструктор для имени и зарплаты, затем установите отдел. Создайте метод getDetails(), который возвращает "[name] manages [department]", обращаясь к защищенному свойству $name напрямую. Также добавьте метод getDepartment(), который возвращает отдел.
  • main.php — Подключите оба файла классов. Создайте объект Manager с именем "Sarah", зарплатой 75000 и отделом "Engineering". Выведите детали менеджера с помощью getDetails(). Затем дайте менеджеру прибавку в размере 5000 и выведите его новую зарплату с помощью getSalary(). Каждый вывод должен быть на новой строке.

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

Шпаргалка

PHP предоставляет три модификатора видимости для свойств класса:

  • public — доступен отовсюду
  • private — доступен только внутри определяющего класса
  • protected — доступен внутри определяющего класса и дочерних классов

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

class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

К приватным свойствам нельзя обратиться напрямую извне класса. Используйте публичные методы для взаимодействия с ними.

Защищенные свойства:

class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email; // Дочерний класс может получить доступ к защищенному свойству
    }
}

Защищенные свойства могут быть доступны дочерним классам, которые расширяют родительский класс.

Когда использовать:

  • Используйте private, когда только определяющий класс должен иметь доступ к свойству
  • Используйте protected, когда дочерним классам также нужен доступ
  • Оба модификатора предотвращают прямой внешний доступ, защищая внутреннее состояние объекта

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

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

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

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

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

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

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

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