Menu
Coddy logo textTech

Public, Protected, Private

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

Добро пожаловать в главу об инкапсуляции! Инкапсуляция — это контроль доступа к внутренним данным вашего класса. PHP предоставляет три модификатора доступа, которые определяют, откуда можно получить доступ к свойствам и методам: public, protected и private.

Вот как работает каждый модификатор:

<?php
class BankAccount {
    public $accountHolder;    // Доступно отовсюду
    protected $accountNumber; // Доступно в этом классе и дочерних классах
    private $balance;         // Доступно только в этом классе
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);

echo $account->accountHolder . "\n";  // Работает - public
echo $account->getBalance();          // Работает - публичный метод

Вывод:

John
1000

Попытка доступа к $account->balance напрямую вызовет ошибку, так как это свойство является закрытым (private). То же самое относится к $account->accountNumber извне иерархии классов. Эта защита гарантирует, что конфиденциальные данные могут быть изменены только с помощью контролируемых методов.

МодификаторТот же классДочерний классВне класса
publicДаДаДа
protectedДаДаНет
privateДаНетНет

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

challenge icon

Задание

Легко

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

Вы организуете свой код в трех файлах:

  • Employee.php — Создайте класс Employee, который управляет данными сотрудников с соответствующими уровнями видимости. Класс должен иметь:
    • public свойство $name для имени сотрудника (безопасно для всеобщего обозрения)
    • protected свойство $employeeId для внутреннего идентификатора (необходимо дочерним классам)
    • private свойство $salary для конфиденциальной информации о зарплате (только этот класс должен иметь к нему прямой доступ)
    Конструктор должен принимать все три значения и присваивать их. Добавьте публичный метод getSalary(), который возвращает приватную зарплату — это контролируемый способ доступа к защищенным данным. Также добавьте публичный метод getPublicInfo(), который возвращает "[name] works here".
  • Manager.php — Создайте класс Manager, который расширяет Employee. Подключите файл Employee. Конструктор должен принимать name, employeeId, salary и название отдела (department). Вызовите родительский конструктор с первыми тремя значениями, затем сохраните отдел в приватном свойстве. Добавьте публичный метод getTeamInfo(), который возвращает "Manager [name] (ID: [employeeId]) leads [department]". Обратите внимание, как дочерний класс может получить доступ к защищенному $employeeId, но ему потребуется getSalary() для доступа к приватной зарплате.
  • main.php — Подключите файл Manager. Вы получите четыре входных значения: имя, ID сотрудника, зарплату (в виде строки, которую вы преобразуете в целое число) и название отдела. Создайте экземпляр Manager с этими значениями. Выведите три строки:
    • Имя менеджера, полученное напрямую (публичное свойство)
    • Результат вызова getTeamInfo()
    • Результат вызова getSalary()

Эта задача демонстрирует инкапсуляцию в действии: имя свободно доступно, ID сотрудника передается дочерним классам через защищенную видимость (protected), а зарплата остается заблокированной в родительском классе — доступной только через контролируемый публичный метод.

Шпаргалка

PHP предоставляет три модификатора доступа для управления тем, где можно получить доступ к свойствам и методам:

МодификаторТот же классДочерний классСнаружи
publicДаДаДа
protectedДаДаНет
privateДаНетНет

Пример:

<?php
class BankAccount {
    public $accountHolder;    // Доступно отовсюду
    protected $accountNumber; // Доступно в этом классе и дочерних классах
    private $balance;         // Доступно только в этом классе
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder;  // Работает - public
echo $account->getBalance();   // Работает - public method

Лучшие практики:

  • Используйте private для внутренних данных, к которым не должно быть прямого доступа
  • Используйте protected для данных, которые необходимы дочерним классам
  • Используйте public только для безопасного внешнего доступа

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

<?php
require_once 'Manager.php';

// Чтение входных данных
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Создайте экземпляр Manager с входными значениями

// TODO: Выведите имя менеджера (доступ к которому осуществляется напрямую как к публичному свойству)

// TODO: Выведите результат вызова getTeamInfo()

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

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

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