зачем нужно позднее статическое связывание в переполнении стека

У меня есть код в php,

<?php
class DB{
protected static $table = 'basetable';
public function Select(){
echo "Select * from" . static::$table;
}
}
class Abc extends DB{
protected static $table = 'abc';
}

$abc = new Abc();
$abc->Select();

Исходя из моего понимания позднего статического связывания, что приведенная выше программа будет выглядеть следующим образом,

Select * from abc;

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

Select * from basetable

из-за поздней статической привязки значение $ table подставляется во время выполнения вместо времени компиляции.

Но наследование не дает тот же результат?

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

и так как $ table = abc в child (класс Abc), не будет ли он переопределен в $ table в parent (Class DB)?

0

Решение

static значения смотрятся иначе, чем $this переменные / свойства. В компиляторе они связаны рано когда вы используете self:

class Foo {
static $bar = 'baz';

function test() {
echo self::$bar;
}
}

Это всегда будет выводить bazнезависимо от того, вы extend класс с чем-то еще или нет. Вот где тебе нужно поздняя статическая привязка с static вместо self,

По сути это позволяет наследование для static ценности, которые были невозможны до того, как существовали.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]