1. 程式人生 > 程式設計 >PHP延遲靜態繫結使用方法例項解析

PHP延遲靜態繫結使用方法例項解析

PHP的繼承模型中有一個存在已久的問題,那就是在父類中引用擴充套件類的最終狀態比較困難。我們來看一下程式碼清單5-11中的例子。

程式碼清單5-11 意想不到的繼承

<?php
 class ParentBase {
  static $property = 'Parent Value';
  public static function render() {
   return self::$property;
  }
 }
 class Descendant extends ParentBase {
  static $property = 'Descendant Value';
 }
 echo Descendant::render();
 Parent Value

在這個例子中,render()方法中使用了self關鍵字,這是指ParentBase類而不是指Descendant類。在ParentBase::render()方法中沒法訪問$property的最終值。為了解決這個問題,需要在子類中重寫render()方法。

通過引入延遲靜態繫結功能,可以使用static作用域關鍵字訪問類的屬性或者方法的最終值,如程式碼所示。

 <?php
 class ParentBase {
  static $property = 'Parent Value';
  public static function render() {
   return static::$property;
  }
} 
 class Descendant extends ParentBase {
  static $property = 'Descendant Value';
 }
 echo Descendant::render();
 Descendant Value

通過使用靜態作用域,可以強制PHP在最終的類中查詢所有屬性的值。除了這個延遲繫結行為,PHP還添加了get_called_class()函式,這允許檢查繼承的方法是從哪個派生類呼叫的。以下程式碼顯示了使用get_called_class()函式獲得當前的類呼叫場景的方法。

使用get_called_class()方法

 <?php
 class ParentBase {
  public static function render() {
   return get_called_class();
  }
 }
 class Decendant extends ParentBase {}
 echo Descendant::render(); 
 Descendant

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。