這篇文章介紹的內容是關於【php類與對象】後期靜態繫結,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
後期靜態繫結
PHP 5.3.0
用於:繼承範圍內引用靜態調用的類
工作原理:
轉寄調用(forwarding call): 通過 self::,parent::,static:: , forward_static_call() (調用一個靜態方法)的靜態調用。
可用 get_called_class() 函數來得到被調用的方法所在的類名,static:: 則指出了其範圍。
該功能從語言內部角度考慮被命名為“後期靜態繫結”。
“後期綁定”的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。
也可以稱之為“靜態繫結”,因為它可以用於(但不限於)靜態方法的調用。
<?phpclass A { public static function who() { echo __CLASS__; //返回該類被定義時的名字 } public static function test() { self::who(); }}class B extends A { // public static function who() { // echo __CLASS__; // }}B::test(); //A?>
後期靜態繫結的用法
後期靜態繫結本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。
簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。
Example #2 static:: 簡單用法<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 注意使用static,後期靜態繫結從這裡開始 }}class B extends A { public static function who() { echo __CLASS__; }}B::test(); //B?>
在非靜態環境下,所調用的類即為該對象執行個體所屬的類。由於 $this-> 會在同一作用範圍內嘗試調用私人方法,而 static:: 則可能給出不同結果。
另一個區別是 static:: 只能用於靜態屬性。
後期靜態繫結
PHP 5.3.0
用於:繼承範圍內引用靜態調用的類
工作原理:
轉寄調用(forwarding call): 通過 self::,parent::,static:: , forward_static_call() (調用一個靜態方法)的靜態調用。
可用 get_called_class() 函數來得到被調用的方法所在的類名,static:: 則指出了其範圍。
該功能從語言內部角度考慮被命名為“後期靜態繫結”。
“後期綁定”的意思是說,static:: 不再被解析為定義當前方法所在的類,而是在實際運行時計算的。
也可以稱之為“靜態繫結”,因為它可以用於(但不限於)靜態方法的調用。
<?phpclass A { public static function who() { echo __CLASS__; //返回該類被定義時的名字 } public static function test() { self::who(); }}class B extends A { // public static function who() { // echo __CLASS__; // }}B::test(); //A?>
後期靜態繫結的用法
後期靜態繫結本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。
簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。
Example #2 static:: 簡單用法<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 注意使用static,後期靜態繫結從這裡開始 }}class B extends A { public static function who() { echo __CLASS__; }}B::test(); //B?>
在非靜態環境下,所調用的類即為該對象執行個體所屬的類。由於 $this-> 會在同一作用範圍內嘗試調用私人方法,而 static:: 則可能給出不同結果。
另一個區別是 static:: 只能用於靜態屬性。