我有一个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 in child(class Abc),不会在父表(类DB)中的$ table上被覆盖?
答案 0 :(得分:0)
static
值的查找方式与$this
变量/属性不同。在编译器中,当您使用self
时,他们 > :
class Foo {
static $bar = 'baz';
function test() {
echo self::$bar;
}
}
这将始终输出baz
,无论您是否extend
该类别与否。您需要使用static
代替self
进行延迟静态绑定的地方。
基本上,它可以为static
值启用继承,但在它存在之前是不可能的。