Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • Employee.php: Define Employee class, который служит базовым для всех сотрудников. В нём должны быть свойство protected $name (чтобы дочерние классы могли получить к нему доступ) и свойство private $salary (только этот class должен напрямую изменять зарплаты). constructor accepts имя и зарплату, устанавливая оба свойства. Добавьте public getName() method, который returns имя, public getSalary() method, который returns зарплату, и public giveRaise($amount) method, который увеличивает зарплату на указанную сумму.
  • Manager.php: Define Manager class, который extends Employee. Подключите файл Employee в верхней части. Добавьте private свойство $department. constructor должен accepts имя, зарплату и department: call parent constructor с помощью parent::__construct($name, $salary), затем установите department. Create method getDetails(), который returns "[name] manages [department]", обращаясь к protected свойству $name directly. Также добавьте method getDepartment(), который returns department.
  • main.php: Подключите оба файла с class. Create Manager с именем "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()
?>
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP