後期靜態繫結在PHP中的使用
什麼叫後期靜態繫結呢?其實我們在之前的文章[PHP中的static]中已經說過這個東西了。今天我們還是再次深入的理解一下這個概念。
首先,我們透過一段程式碼來引入後期靜態繫結這一概念:
class A
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
public static function test()
{
self::who();
}
}
class B extends A
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
}
B::test(); // A
在這段程式碼中,我們使用了self關鍵字,當使用B類呼叫test()靜態方法時,self指向的是A類的who()方法,因此,輸出的是A。別激動,這是普通的靜態繫結。self關鍵字呼叫的內容取決於它定義時所在的類。也就是說不管怎麼繼承,用哪個子類來呼叫test()方法,self關鍵字都會呼叫的是A類的who()方法。
而後期靜態繫結呢?其實就有點像例項化的類物件,每個例項化的物件,呼叫的都是自身,而不是父類的屬性方法。普通的靜態呼叫可不是這樣,但是現實中我們又有這樣的需求,就像例項化物件的呼叫方式一樣來呼叫靜態屬性方法,這時,我們就可以使用static關鍵字來實現後期靜態繫結。
class C
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
public static function test()
{
static::who();
}
}
class D extends C
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
}
D::test(); // D
當使用static關鍵字後,這裡D類呼叫的test()方法內部呼叫的who()就是D類自己了。
官方文件中的定義如下:
當進行靜態方法呼叫時,該類名即為明確指定的那個(通常在 :: 運算子左側部分);當進行非靜態方法呼叫時,即為該物件所屬的類。
該功能從語言內部角度考慮被命名為“後期靜態繫結”。“後期繫結”的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際執行時計算的。也可以稱之為“靜態繫結”,因為它可以用於(但不限於)靜態方法的呼叫。
除了self和static關鍵字外,我們還有一個parent關鍵字,這個關鍵字的意義就很明顯了,呼叫父類的靜態內容。我們同時用三個關鍵字一起來進行測試:
class E
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
public static function test()
{
self::who();
static::who();
}
}
class F extends E
{
public static function who()
{
echo __CLASS__, PHP_EOL;
}
}
class G extends F
{
public static function who()
{
parent::who();
echo __CLASS__, PHP_EOL;
}
}
G::test();
// E
// F
// G
最後,我們再來看兩個PHP的方法,一個是get_called_class()方法,用來獲取當前呼叫的是哪個類。在靜態方法中可以根據呼叫方式判斷當前類是哪個類來進行其他的業務邏輯操作。另一個是forward_static_call()方法,用於靜態方法的呼叫。
class H
{
public static function who()
{
echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL;
}
public static function test()
{
echo get_called_class(), PHP_EOL;
forward_static_call('who', 'a', 'b'); // xxx:a,b
forward_static_call(['I', 'who'], 'c', 'd'); // I:c,d
forward_static_call_array(['H', 'who'], ['e', 'f']); // H:e,f
}
}
class I extends H
{
public static function who()
{
echo __CLASS__ . ':' . join(',', func_get_args()), PHP_EOL;
}
}
function who()
{
echo 'xxx:' . join(',', func_get_args()), PHP_EOL;
}
H::test(); // H
// xxx:a,b
// I:c,d
// H:e,f
I::test(); // I
// xxx:a,b
// I:c,d
// H:e,f
注意,如果forward_static_call()不指定類名的話,將呼叫全域性的方法。forward_static_call_array()則是將引數使用陣列進行傳遞。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2827023/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php 後期靜態繫結PHP
- 對 PHP 後期靜態繫結的理解PHP
- 後期靜態繫結
- 深入理解PHP物件導向之後期靜態繫結PHP物件
- PHP 物件導向 (七)訪問物件的方式及後期靜態繫結PHP物件
- java中的靜態繫結與動態繫結Java
- 介面(抽象類)與後期靜態繫結學習抽象
- C++的動態繫結和靜態繫結C++
- 理解靜態繫結與動態繫結
- 延遲靜態繫結——static
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- 在 PhpStorm 中使用 PHP Inspections 進行程式碼靜態分析PHPORM行程
- Java中靜態跟非靜態的區別總結Java
- 在AndroidStudio下使用cmake編譯出靜態連結庫的方法Android編譯
- 在 Vue 中如何避免在動態繫結 類 出現空 類 的情況?Vue
- 使用 Hooks 簡化受控元件的狀態繫結Hook元件
- Flow靜態型別檢查及在Vue專案中的使用型別Vue
- 在繫結變數下使用outline變數
- 在Lua中實現Rust物件的繫結Rust物件
- 構造器中呼叫動態繫結的方法
- 16 ##### 適合靜態方法的場景:方法中不使用物件的值,則直接使用靜態方法物件
- PHP中Trait的使用總結PHPAI
- PHP重定向與偽靜態PHP
- 引數繫結在PHP程式碼測試中的重要作用與應用場景PHP
- static靜態方法的使用
- 關於動態字串的繫結字串
- goto 語法在 PHP 中的使用GoPHP
- 在React ClassComponent中繫結方法的正確姿勢React
- ES6中類的靜態方法=> static 的使用
- Hive中靜態分割槽和動態分割槽總結Hive
- PHP獲取動態跳轉後的真實連結PHP
- PHP 物件導向 (五)靜態方法PHP物件
- 關於php生成靜態問題PHP
- PHP 實現頁面靜態化PHP
- 在.Net Core當中的WebApi 的模型繫結各種示例用法 以及使用場景WebAPI模型
- vue生命週期、雙向繫結Vue
- 在 Linux中如何使用動態連結模組庫?Linux
- 討論篇:靜態變數生命週期到底何如?如何使用?變數