今天,几个朋友在一起吹牛逼,一个朋友问我什么是静态绑定,我当时懵逼了,后面回来一查,这玩意儿不就是以前写代码的时候用到过的吗,不废话了,遇到了就总结一次吧。
先看下面的代码:
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调用,如果没有,则报错。
理解有什么错误望大家指出。