Позднее статическое связывание php: как это работает?

Здравствуйте!

Для начало приведу отрывок из официальной документации:

Начиная с версии PHP 5.3.0 появилась особенность, называемая позднее статическое связывание, которая может быть использована для того чтобы получить ссылку на вызываемый класс в контексте статического наследования

Я просто все еще не могу понять, что это такое и где применять ?
Вот пример , как видите static::area() находится внутри не статичного метода, и соответственно тут происходит позднее статическое связывание, но как быть с приведенной наверху цитатой, там написано в контексте статического наследования, в общем я запутался:
abstract class Shape2D{
	public $PI = 3.14;
	public $side = 0;
	abstract public function area();

	public function info(){
		echo "<br>";
		echo "The area of a figure = ".static::area();
		echo "<br>";
	}
}

class Square extends Shape2D{

	public $dlina = 0;

	public function __construct($dlina){
		$this->$dlina = $dlina;
		$this->side = $dlina;
	}

	public function area(){
		return $this->side * $this->$dlina;
	}
}

$sq = new Square(10);
$sq->info();
  • Вопрос задан
  • 12824 просмотра
Решения вопроса 1
MegaMufa
@MegaMufa
Смотрите. Есть такая простая иерархия классов:
class A
{
    public static $text = 'class A';

    public function selfTest()
    {
        echo self::$text;
    }

    public function staticTest()
    {
        echo static::$text;
    }
}

class B extends A
{
    public static $text = 'class B';
}


Мы создаем экземпляк субкласа и вызываем методы, определенные в предке.
$obj = new B();
$obj->selfTest(); // выведет "class A"
$obj->staticTest(); // выведет "class B"

self всегда указывает на тот класс, в котором он написал. Здесь метод описан в классе A, и self указывает на класс A, хоть и вызывается из класса B.
Значение static вычисляется при вызове. И static указывает на класс объекта в котором произошел вызов. В нашем случае он указывает на B, хотя сам код описан в классе A.

Зачем это надо? Для того, что бы можно было переопределять статичные члены вашего класса в наследниках и вы могли обращаться к новым значениям из методов, описанных в предке.

С обычными не статичными членами это и так работает, потому что они собираются, когда вы создаете объект класса. Что бы это работало для статичных методов, надо использовать static
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
в вашем примере area - не статический метод, позднее статическое связывание позволяет переопределять статические методы предков.
посмотрите офф документацию, там же всё разжёвано с примерами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы