Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: static, binding

Где применяется позднее статическое связывание?

Этот вопрос проверяет понимание тонкостей наследования статических методов в PHP и знание ключевого слова static.

Короткий ответ

Позднее статическое связывание (PSB) применяется, когда нужно, чтобы статический метод в родительском классе ссылался на класс, в котором он был вызван, а не на класс, в котором он объявлен. Это решает проблему "раннего" связывания, когда ключевое слово self всегда указывает на класс, где оно написано. PSB используется для реализации паттерна "Активные записи" (Active Record), фабричных методов и в любом месте, где логика в родительском классе зависит от класса-потомка.

Длинный ответ

Позднее статическое связывание (Late Static Binding) — это механизм, который позволяет ссылаться на вызываемый класс в контексте статического наследования.

Проблема, которую решает PSB:

Без PSB ключевое слово self всегда привязано к классу, в котором оно объявлено.

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who(); // Всегда ссылается на A
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); // Выведет 'A', хотя мы вызвали метод у класса B.

Решение с помощью static:

Ключевое слово static ссылается на класс, в котором метод был вызван.

class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Ссылается на класс, в котором вызван
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test(); // Выведет 'B', что и является ожидаемым поведением.

Основные случаи применения:

  • Паттерн Active Record / ORM:

    • Родительский класс Model может иметь метод find(), который должен возвращать экземпляр не Model, а конкретного класса-потомка (User, Product).

    class Model {
        public static function find($id) {
            // ... логика поиска в БД ...
            return new static($data); // Создает объект того класса, у которого был вызван метод
        }
    }
    
    class User extends Model {}
    $user = User::find(1); // Вернет объект класса User, а не Model.
  • Фабричные методы (Factory Method):

    • Создание объектов, тип которых зависит от класса-потомка.

  • Реализация шаблона Singleton для иерархии классов.

Вывод: PSB стоит применять в родительских классах, когда их статическая логика должна быть полиморфной и зависеть от конкретного класса-потомка, который ее вызывает. Это ключевой инструмент для создания гибких и расширяемых библиотек и ORM.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • PHP

    PHP

Ключевые слова

#static

#binding

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.