PHP → Late Static Binding простыми словами

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

Позднее связывание означает, что объект связывается с вызовом функции только во время исполнения программы, а не раньше.

Пример Late Dynamic Binding

class Shape {
    public function draw() { echo 'Draw some shape..'; }
}

class Square extends Shape {
    public function draw() { echo 'Draw square..'; }
}

class Circle extends Shape {
    public function draw(){ echo 'Draw circle..'; }
}

function drawShape(Shape $shape) {
    $shape->draw();
}
drawShape(new Circle()); // echo 'Draw cirlce..'

Транслятор каждый раз при проходе через этот участок будет проверять что это за объект $shape, и выбирать реализацию метода draw() из соответствующего класса.

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

Поздним, потому что мы связываем объект и реализацию уже после компиляции.
Динамическим, потому что мы делаем это при каждом прохождении через этот участок.

Пример Late Static Binding

Позднее статическое связывание позволяет нам получить ссылку на вызываемый класс в контексте статического наследования.

«Позднее связывание» в названии отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться в ходе исполнения.

«Статическое» отражает, что связывание может быть использовано (но не обязательно) в статических методах.

class ParentClass {
    public static function who() {
        echo __CLASS__;
    }
    public static function useSelf() {
        self::who();
    }
    public static function useStatic() {
        // применение Late Static Bidning
        static::who();
    }
}

class ChildClass extends ParentClass {
    public static function who() {
        echo __CLASS__;
    }
}

ChildClass::useSelf(); // ParentClass
// but
ChildClass::useStatic(); // ChildClass

Простыми словами позднее статическое связывание это «об» ключевом слова  static, которое ссылается на класс, вызванный непосредственно в ходе выполнения.