1. 程式人生 > >php中“延遲靜態繫結”的使用

php中“延遲靜態繫結”的使用

PHP的繼承模型中有一個存在已久的問題,那就是在父類中引用擴充套件類的最終狀態比較困難。我們來看一下程式碼清單5-11中的例子。
程式碼清單5-11 意想不到的繼承
複製程式碼  1 <?php
 2  3 class ParentBase {
 4  5 static$property='Parent Value';
 6  7 publicstaticfunction render() {
 8  9 return self::$property;
10 11   }
12 13 }
14 15 class Descendant extends ParentBase {
16 17 static$property='Descendant Value';
18 19 }
20 21 echo Descendant::render();
22 23
 Parent Value 複製程式碼 在這個例子中,render()方法中使用了self關鍵字,這是指ParentBase類而不是指Descendant類。在ParentBase::render()方法中沒法訪問$property的最終值。為了解決這個問題,需要在子類中重寫render()方法。

通過引入延遲靜態繫結功能,可以使用static作用域關鍵字訪問類的屬性或者方法的最終值,如程式碼所示。
複製程式碼  1 <?php
 2  3 class ParentBase {
 4  5 static$property='Parent Value';
 6  7 publicstaticfunction render() {
 8  9 returnstatic::$property;
10 11   }
12 13 }
14 15 class Descendant extends ParentBase {
16 17 static$property='Descendant Value';
18 19 }
20 21 echo Descendant::render();
22 23 Descendant Value 複製程式碼
通過使用靜態作用域,可以強制PHP在最終的類中查詢所有屬性的值。除了這個延遲繫結行為,PHP還添加了get_called_class()函式,這允許檢查繼承的方法是從哪個派生類呼叫的。以下程式碼顯示了使用get_called_class()函式獲得當前的類呼叫場景的方法。

使用get_called_class()方法


複製程式碼  1 <?php
 2  3 class ParentBase {
 4  5 publicstaticfunction render() {
 6  7 return get_called_class();
 8  9   }
10 11 }
12 13 class Decendant extends ParentBase {}
14 15 echo Descendant::render();
16 17 Descendant 複製程式碼