У меня есть код в 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)?
static
значения смотрятся иначе, чем $this
переменные / свойства. В компиляторе они связаны рано когда вы используете self
:
class Foo {
static $bar = 'baz';
function test() {
echo self::$bar;
}
}
Это всегда будет выводить baz
независимо от того, вы extend
класс с чем-то еще или нет. Вот где тебе нужно поздняя статическая привязка с static
вместо self
,
По сути это позволяет наследование для static
ценности, которые были невозможны до того, как существовали.
Других решений пока нет …