什么是PHP中的后期静态绑定的需要

时间:2018-06-16 12:21:44

标签: php late-static-binding

我有一个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上被覆盖?

1 个答案:

答案 0 :(得分:0)

static值的查找方式与$this变量/属性不同。在编译器中,当您使用self时,他们 >

class Foo {
    static $bar = 'baz';

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

这将始终输出baz,无论您是否extend该类别与否。您需要使用static代替self进行延迟静态绑定的地方。

基本上,它可以为static值启用继承,但在它存在之前是不可能的。