PHP的'静态延迟绑定'

今天,几个朋友在一起吹牛逼,一个朋友问我什么是静态绑定,我当时懵逼了,后面回来一查,这玩意儿不就是以前写代码的时候用到过的吗,不废话了,遇到了就总结一次吧。

先看下面的代码:

class MainSearch{
        const LENGTH = 1000;
        public function get(){
                echo slef::LENGTH;
        }
}

class SpSearch extends MainSearch{
        const LENGTH = 200;
}

$spSearch = new SpSearch();
$spSearch->get();
//注意这个时候我们理想是输出200,但是实际是输出1000;
//Chen@DESKTOP-02BVSM6 MINGW64 /d/php
//$ php static.php
//1000

这个时候我们怎么才能输出初始化的类中的LENGTH=200呢,我们用static关键字,static这个关键字是从php5.3开始后支持这样操作(静态延迟绑定),看下面代码。

class MainSearch{
        const LENGTH = 1000;
        public function get(){
                echo static::LENGTH;
        }  
}

class SpSearch extends MainSearch{
        const LENGTH = 200;
}

$spSearch = new SpSearch();
$spSearch->get();
//这个时候就输出了200
//Chen@DESKTOP-02BVSM6 MINGW64 /d/php
//$ php static.php
//200

如果我们把get()方法放到SpSearch这个类中又是怎么样的呢,让我们看下面的代码:

class MainSearch{
        const LENGTH = 1000;
}
class SpSearch extends MainSearch{
        const LENGTH = 200;
        public function get(){
                echo self::LENGTH;
        }
}

$spSearch = new SpSearch();
$spSearch->get();
//最后结果输出200,我们把self换为static结果也输出200.

自己的总结:

  • 针对类中的self调用,无论是实例化该类的子类,还是本身,都是调用存在self类中的数据,如果存在self的类中没有,则依次向上取父类中的对应的self调用,如果没有,则报错。
  • 针对类中的static调用,无论是实例化该类的子类还是该类,都是调用实例化类中对应的static调用的值,如果实例化的类中没有,则向上取父类中对应的static调用,如果没有,则报错。

理解有什么错误望大家指出。

你可能感兴趣的:(PHP的'静态延迟绑定')