Позднее статическое связывание является очень важной концепцией в PHP. В этом уроке мы узнаем, что такое позднее статическое связывание и как использовать эту концепцию.

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

Прежде чем углубиться в концепцию позднего статического связывания, давайте разберемся в разнице между self и static в PHP.

Разница между self и static в PHP

Когда мы используем ключевое слово self в классе, оно всегда будет относиться к тому классу, в котором оно упоминается, а не к классу, который его наследует. Давайте разберемся с этой концепцией на примере:

<?php

class A {
    public static function printClass() {
        return self::getClassName();
    }

    public static function getClassName() {
        return __class__;
    }
}

echo A::printClass(); // A is printed


Результат выполнения вышеупомянутого сценария - вывод "А". Это то, что мы ожидали. Давайте перейдем к другому примеру.

<?php

class A {
    public static function printClass() {
		return self::getClassName();
    }
	
    public static function getClassName() {
		return __class__;
    }
}

class B extends A {
    public static function getClassName() {
		return __class__;
    }
}

echo B::printClass(); // Still it prints A

И снова результатом выполнения этого сценария является вывод "А". Метод printClass определен внутри класса A. Класс B расширяет класс A. Когда мы вызываем метод printClass, область действия этого метода все еще находится внутри класса A.

ПРИМЕЧАНИЕ: ключевое слово self в PHP относится к классу, в котором оно находится, и не обязательно к классу, его расширяющему.

Позднее статическое связывание в PHP

Чтобы решить эту проблему, на помощь приходит концепция позднего статического связывания. Давайте использовать ключевое слово static вместо self.

<?php

class A {
	public static function printClass() {
		return static::getClassName();
	}
	
	public static function getClassName() {
		return __class__;
	}
}

class B extends A {
	public static function getClassName() {
		return __class__;
	}
}

echo B::printClass();  // Prints B
echo A::printClass();  // Prints A


Когда мы используем ключевое слово staticмы ссылаемся на класс, который вызывается во время выполнения.

Само название "позднее статическое связывание" отражает в себе внутреннюю реализацию этой особенности. "Позднее связывание" отражает тот факт, что обращения через static:: не будут вычисляться по отношению к классу, в котором вызываемый метод определен, а будут вычисляться на основе информации в ходе исполнения. Также эта особенность была названа "статическое связывание" потому, что она может быть использована (но не обязательно) в статических методах.

Руководство php.net

Перевел scorp13

Статья является свободным переводом материала сайта https://webrewrite.com/