Выбор ответа Middle ООП, трейты и интерфейсы спрашивают часто обновлено

self и static: позднее статическое связывание

Вопрос

Что выведет Child::create()?

class Base {
    public static function create(): string {
        return get_class(new self()) . ' ' . get_class(new static());
    }
}
class Child extends Base {}

echo Child::create();

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

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Base Child. new self() создаёт объект класса, где написан код, то есть Base. new static() использует позднее статическое связывание и создаёт объект класса, через который вызвали метод: Child.

Варианты ответа

  1. Base Childправильный ответ
  2. Base Base
  3. Child Child
  4. Child Base

Разбор

new self() создаёт объект класса, где написан код, то есть Base. new static() использует позднее статическое связывание и создаёт объект класса, через который вызвали метод: Child. На этом строят фабричные методы и fluent-интерфейсы в базовых классах, например Model::create() в ORM.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.