前期绑定 php,关于php:后期静态绑定在PHP中的使用
什么叫前期動態綁定呢?其實咱們在之前的文章PHP中的static中曾經說過這個貨色了。明天咱們還是再次深刻的了解一下這個概念。
首先,咱們通過一段代碼來引入前期動態綁定這一概念:
【騰訊云】云產品限時秒殺,爆款1核2G云服務器,首年99元
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()則是將參數應用數組進行傳遞。
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/%E5%90%8E%E6%9C%9F%E9%9D%99%E6%80%81%E7%BB%91%E5%AE%9A%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php
參考文檔:
https://www.php.net/manual/zh/language.oop5.late-static-bindings.php
https://www.php.net/manual/zh/function.get-called-class.php
https://www.php.net/manual/zh/function.forward-static-call.php
各自媒體平臺均可搜尋【硬核項目經理】
總結
以上是生活随笔為你收集整理的前期绑定 php,关于php:后期静态绑定在PHP中的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 242.有效的字母异位
- 下一篇: mysql统计每周每个学校新增学生数量_