在觀看laravel源碼的時候,突然看到了
public static function getInstance()
{
if (is_null(static::$instance)) {
static::$instance = new static;
}
return static::$instance;
}
雖然之前翻看手冊的時候看到過豺总,但很少使用,于是仔細看了一下择懂,原來是后期靜態(tài)綁定喻喳。但是后期靜態(tài)綁定又是什么鬼,還是仔細分析下吧困曙。
由來
PHP在繼承體系中表伦,調(diào)用分為轉(zhuǎn)發(fā)調(diào)用和非轉(zhuǎn)發(fā)調(diào)用。
- 轉(zhuǎn)發(fā)調(diào)用(可以使用get_called_class()獲取調(diào)用類的名稱)
*self::*慷丽,*parent::*蹦哼,*static::* 以及 forward_static_call()
屬于轉(zhuǎn)發(fā)調(diào)用
- 使用
self::
或者__CLASS__
對當前類的靜態(tài)引用,取決于定義當前方法所在的類要糊。 - 使用
parent::
表示對當前類的父類的靜態(tài)引用纲熏。 -
static::
“后期綁定”的意思是說,static::
不再被解析為定義當前方法所在的類锄俄,而是在實際運行時計算的局劲。也可以稱之為“靜態(tài)綁定”,因為它可以用于(但不限于)靜態(tài)方法的調(diào)用珊膜。
這是什么意思呢容握?還是通過代碼來說比較好宣脉,哈哈
class A{
public static function call(){
static::who();
}
public static function who(){
echo __CLASS__,'1<br>';
echo get_called_class(),'2<br>';
}
}
class B extends A{
public static function who(){
echo __CLASS__.'3<br>';
echo get_called_class(),'5<br>';
}
}
class C extends B{
}
$c = new C();
C::call(); //結(jié)果是B3车柠,C5
class A{
public static function call(){
static::who();
}
public static function who(){
echo __CLASS__,'1<br>';
echo get_called_class(),'2<br>';
}
}
class B extends A{
public static function who(){
echo __CLASS__.'3<br>';
echo get_called_class(),'5<br>';
}
}
class C extends B{
public static function who(){
echo __CLASS__.'6<br>';
echo get_called_class(),'7<br>';
}
}
$c = new C();
C::call(); //結(jié)果是C6,C7。
class A{
static $instance;
}
class B extends A{
public static function put(){
return static::$instance = new static ;
}
}
class C extends B{
}
var_dump(C::put()); // object(C)#1 (0) { }
var_dump(B::put()); // object(B)#1 (0) { }
不知道大家有沒有看懂竹祷,我認為谈跛,static::
類似于this
,this
是對當前對象的引用塑陵,而static::
是對當前調(diào)用類的引用感憾。
- 非轉(zhuǎn)發(fā)調(diào)用
- 直接使用
類名:: fun()