進階PHP V5 對象研究_PHP教程

來源:互聯網
上載者:User
進階PHP V5 對象研究
本文介紹了PHP V5一些更進階的面向設計的特性。其中包括各種物件類型,它們允許將系統中的組件相互分離,建立可重用、可擴充、可伸縮的代碼。


  領會暗示

  首先介紹一下物件類型和類型提示的優點。一個類定義一種類型。從該類執行個體化的任何對象屬於該類定義的類型。所以,使用 Car 類建立 Car 對象。如果 Car 類繼承 Vehicle 超類,則 Car 對象還將是一個 Vehicle 對象。這反映了我們在現實世界中分類事物的方法。但正如您將看到的,類型不僅僅是分類系統元素的有用方法。類型是物件導向編程的基礎,因為類型是良好一致的行為的保證。許多設計技巧來自該保證。

  “開始瞭解 PHP V5 中的對象”展示對象為您保證了介面。當系統傳遞 Dictionary 對象時,您可以確定它具有 $translations 數組和 summarize() 方法。相反,關聯陣列不提供相同層級的確定性。要利用類提供的清晰介面,需要知道您的對象實際上是 Dictionary 的一個執行個體,而不是某個 imposter。可以用 instanceof 操作符來手動驗證這一點,該操作符是 PHP V5 引入的介於對象執行個體和類名之間的一個便捷工具。

   instanceof Dictionary

  如果給定對象是給定類的執行個體,則 instanceof 操作符解析為真。在調用方法中第一次遇到 Dictionary 對象時,可以在使用它之前檢查它的類型。

if ( $en instanceof Dictionary ) {
 print $en->summarize();
}

  但是,如果使用 PHP V5 的話,可以將物件類型檢查構建到類或方法聲明中。

  在“開始瞭解 PHP V5 中的對象”中,重點介紹兩個類:Dictionary,它儲存術語和翻譯, DictionaryIO,它將 Dictionary 資料匯出(匯入)自(至)檔案系統。這些特性使得將 Dictionary 檔案發送到第三方翻譯器變得容易,第三方翻譯器可以使用自己的軟體來編輯資料。然後,您可以重新匯入已處理的檔案。清單 1 是 Dictionary 類的一個版本,它接受一個 DictionaryIO 對象,並將其儲存以備將來使用。

  清單 1. 接受 DictionaryIO 對象的 Dictionary 類的一個版本

class Dictionary {
 public $translations = array();
 public $type ="En";
 public $dictio;

 function addDictionaryIO( $dictio ) {
  $this->dictio=$dictio;
 }

 function export() {
  if ( $this->dictio ) {
   $this->dictio->export( $this );
  }
 }
}

class DictionaryIO {
 function export( $dict ) {
  print "exporting dictionary data "."($dict->type)";
 }
}

$en = new Dictionary();
$en->addDictionaryIO( new DictionaryIO() );
$en->export();

// output:
// dumping dictionary data (En)

  DictionaryIO 類具有單個方法 export(),它接受一個 Dictionary 對象,並使用它來輸出假訊息。現在,Dictionary 具有兩個新方法:addDictionaryIO(),接受並儲存 DictionaryIO 對象; export(),使用已提供的對象匯出 Dictionary 資料 —— 或者是在完全實現的版本中。

  您可能會疑惑為什麼 Dictionary 對象不僅執行個體化自己的 DictionaryIO 對象,或者甚至在內部處理匯入匯出操作,而根本不求助於第二個對象。一個原因是您可能希望一個 DictionaryIO 對象使用多個 Dictionary 對象,或者希望儲存該對象的單獨引用。另一個原因是通過將 DictionaryIO 對象傳遞給 Dictionary,可以利用類切換或 多態性。換句話說,可以將 DictionaryIO 子類(比如 XmlDictionaryIO)的執行個體傳遞給 Dictionary,並更改運行時儲存和檢索資料的方法。

  圖 1 顯示了 Dictionary 和 DictionaryIO 類及其使用關係。

正如所顯示的,沒有什麼阻止編碼器將完全隨機的對象傳遞給 addDictionaryIO()。只有在運行 export() 時,才會獲得一個類似的錯誤,並發現已經儲存在 $dictio 中的對象實際上並沒有 export() 方法。使用 PHP V4 時,必須測試本例中的參數類型,以絕對確保編碼器傳遞類型正確的對象。使用 PHP V5 時,可以部署參數提示來強制物件類型。只將所需的物件類型添加到方法聲明的參數變數中,如清單 2 所示:

  清單 2. 將物件類型添加到方法聲明的參數變數中

function addDictionaryIO( DictionaryIO $dictio ) {
 $this->dictio=$dictio;
}

function export() {
 if ( $this->dictio ) {
  $this->dictio->export( $this );
 }
}

  現在,如果客戶機編碼器試圖將類型錯誤的對象傳遞給 addDictionaryIO(),PHP 引擎將拋出一個致命錯誤。因此,類型提示使得代碼更安全。不幸的是,提示僅對對象有效,所以不能在參數列表中要求字串或整數。必須手動測試這些原類型。

  即使可以保證 addDictionaryIO() 將獲得正確的物件類型,但不能保證該方法被首先調用。export() 方法測試 export() 方法中 $dictio 屬性的存在,從而避免錯誤。但您可能希望更嚴格一些,要求 DictionaryIO 對象傳遞給建構函式,從而確保 $dictio 總是被填充。

  調用覆蓋方法

  在清單 3 中,XmlDictionaryIO 整合 DictionaryIO。而 DictionaryIO 寫入並讀取序列化資料,XmlDictionaryIO 操作 XML,可以與第三方應用程式共用。XmlDictionaryIO 可以覆蓋其父方法(import() 和 export()),也可以選擇不提供自己的實現(path())。如果客戶機調用 XmlDictionaryIO 對象中的 path() 方法,則在 DictionaryIO 中實現的 path() 方法被調用。

  事實上,可以同時使用這兩種方法。可以覆蓋方法並調用父實現。為此,使用新關鍵字 parent。用範圍解析操作符和所討論方法的名稱來使用 parent 。例如,假設需要 XmlDictionaryIO 使用當前工作目錄(如果有一個可用)中叫做 xml 的目錄;否則,它應使用由父 DictionaryIO 類產生的預設路徑,如清單 3 所示:

  清單 3. XmlDictionaryIO 使用 xml 目錄或由 DictionaryIO 類產生的預設路徑

class XmlDictionaryIO extends DictionaryIO {

 function path( Dictionary $dictionary, $ext ) {
  $sep = DIRECTORY_SEPARATOR;
  if ( is_dir( ".{$sep}xml" ) ) {
   return ".{$sep}xml{$sep}{$dictionary->getType()}.$ext";
  }
  return parent::path( $dictionary, $ext );
 }
// ...

  可以看到,該方法檢查本地 xml 目錄。如果該測試失敗,則它使用 parent 關鍵字指派給父方法。

本新聞共3頁,當前在第1頁 1 2 3


子類和建構函式方法

  parent 關鍵字在建構函式方法中尤其重要。如果在子類中不定義建構函式,則 parent 建構函式代表您被顯式調用。如果在子類中不建立建構函式方法。則調用父類的建構函式並傳遞任何參數是您的責任,如清單 4 所示:

  Listing 4. Invoking the parent class’s constructor

class SpecialDictionary extends Dictionary {
 function __construct( $type, DictionaryIO $dictio, $additional ) {
  // do something with $additional
  parent::__construct( $type, $dictio );
 }
}


抽象類別和方法

  雖然在父類中提供預設行為是完全合法的,但這可能不是最巧妙的方法。對於啟動器,您必須依賴子類的作者來理解它們必須實現 import() 和 export(),才能在 broken 狀態建立類。而且,DictionaryIO 類實際上是兄弟,而不是父子。XmlDictionaryIO 不是 DictionaryIO 的特例;相反,它是一種備選實現。

  PHP V5 允許定義部分實現的類,其主要角色是為它的子女指定核心介面。這種類必須聲明為抽象。


abstract class DictionaryIO {}


  抽象類別不能執行個體化。必須建立子類(即,建立繼承它的類),並建立該子類的執行個體。可以在抽象類別中聲明標準和抽象方法,如清單 5 所示。抽象方法

http://www.bkjia.com/PHPjc/532425.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/532425.htmlTechArticle進階PHPV5對象研究 本文介紹了PHPV5一些更進階的面向設計的特性。其中包括各種物件類型,它們允許將系統中的組件相互分離,建立可重用...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.