Зарегистрируйтесь, чтобы продолжить обучение

Модификаторы доступа PHP: Погружаясь в классы

Видимость свойств влияет не только на внешнее поведение объектов, но и на отношения между наследуемыми классами. Публичные свойства и методы доступны всем наследникам. К ним можно обращаться как внутри объекта, так и снаружи:

<?php

class HTMLElement
{
    public $visible = true;

    public function isVisible()
    {
        return $this->visible;
    }
}

class DivElement extends HTMLElement
{
    public function isVisiblePropertyFromParent()
    {
        return $this->visible;
    }
    public function isVisibleMethodFromParent()
    {
        return $this->isVisible();
    }
}

$div = new DivElement();

// Вызов родительского свойства напрямую
echo $div->visible; // => true
// Вызов родительского метода напрямую
echo $div->isVisible(); // => true

// Вызов родительского свойства изнутри объекта
echo $div->isVisiblePropertyFromParent(); // => true

// Вызов родительского метода изнутри объекта
echo $div->isVisibleMethodFromParent(); // => true

Количество классов в цепочке наследования никак не влияет на это поведение. Любой подкласс DivElement, точно так же получит доступ к публичным частям HTMLElement:

<?php

class DivElementWithEmptyBody extends DivElement
{

}

$div = new DivElementWithEmptyBody();

// Вызов родительского свойства напрямую
echo $div->visible; // => true
// Вызов родительского метода напрямую
echo $div->isVisible(); // => true

Наследование не влияет на поведение свойств внутри объектов. Значение visible в каждом конкретном объекте связано только с этим объектом:

<?php

$div1 = new DivElementWithEmptyBody();
$div2 = new DivElement();

echo $div1->visible; // => true
echo $div2->visible; // => true

$div1->visible = false; // true
echo $div1->visible; // => false
echo $div2->visible; // => true

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

Приватные свойства и методы, доступны только внутри того класса, где они были определены. Наследники не могут получить к ним доступ. Подразумевается, что приватные сущности это нечто персональное для класса, его внутренняя реализация, которую нельзя выставлять наружу. Однако, это не отменяет возможности взаимодействовать с приватными данными через публичный интерфейс.

<?php

class HTMLElement
{
    private $visible = true;

    public function isVisible()
    {
        return $this->visible;
    }
}

$div = new DivElement();
$div->isVisible(); // true
$div->visible; // Error

Защищённые свойства и методы

Они имеют самое необычное поведение, некая смесь между публичными и приватными. Ключевое слово protected используется тогда, когда разработчик хочет запретить доступ снаружи объекта, но дать возможность работать с ними внутри объекта класса-наследника или суперкласса. Звучит довольно туманно, посмотрим на практике:

<?php

class HTMLElement
{
    protected $visible = true;

    public function isVisible()
    {
        return $this->visible;
    }
}

class DivElement extends HTMLElement
{
    public function isVisiblePropertyFromParent()
    {
        return $this->visible;
    }
}

$div = new DivElement();

// Доступно внутри через родительский метод
$div->isVisible(); // true
// Доступно внутри напрямую
$div->isVisiblePropertyFromParent(); // true

// Недоступно снаружи
$div->visible; // Error

Выбор

Мы только начали знакомиться с наследованием, но уже сейчас видно, что всё не просто. Одну и ту же задачу можно сделать множеством способов. Какой предпочесть?

Универсальная стратегия, которой стоит придерживаться в большинстве случаев – всегда работать через абстракцию, пока она не мешает. Это значит что все свойства делаются приватными, а наружу выставляется публичный интерфейс (методы). Если из задачи очевидно, что публичный интерфейс нужен только наследникам и не должен использоваться снаружи объекта, то для этих методов ставится модификатор protected.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»