淺談PHP面向物件程式設計(六)
6.0 自動載入及魔術方法
6.1 自動載入
在PHP開發過程中,如果希望從外部引入一個class.通常會使用incluae和requre方法把定義這個class的檔案包含進來。但是,在大型的開發專案中,這麼做會產生大量的require或者include方法的使用。這樣不僅會降低效率,並且使程式碼難以維護。
如果不小心忘記引入某個類的定又檔案,PHP就會報告一個致命錯誤,導致整個應用程式崩潰。
為了解決上述問題,PHP提供了類的自動載入機制,即定義一個_ autoload()函式,它會在試圖使用尚未被定義的類時自動呼叫。
這樣,PHP在報告錯誤之前會有最後一個機會載入所需的類。為了方便理解自動載入機制,接下來通過一個案例來說明_autoload()是 如何實現自動載入的。
首先在當前目錄下,定義類檔案MyClass1.cass.php.示例程式碼如下:
1 <?php 2 class MyClass1{ 3 4 } 5 ?>
定義類檔案MyClass2.cass.php.示例程式碼如下:
1 <?php 2 class MyClass2{ 3 4 } 5 ?>
需要注意的是,對於類定義檔案,通常使用 類名 .class.php
__autoload()方法的使用如例6-16所示
例6-16
1 <?php 2 function __autoload($classname){ 3 require_once $classname . ".class.php"; 4 } 5 $obj1 = new MyClass1(); 6 $obj2 = new MyClass2(); 7 var_dump($obj1); 8 var_dump($obj2); 9 ?>
執行結果
從上圖中可以看出試覽器並沒有訪問過這兩個類定義檔案,在程式碼中也沒有使用include (或requre)將其包含,但是卻獲得了這兩個類的物件。由此說明,__autolad() 函式可以實現自動載入功能。
需要注意的是,自動載入是指當需要類定義檔案而沒有找到時,會自動的呼叫_autolad函式,它不只限於例項化物件,還包括繼承、序列化等操作。
而且, 自動載入並不能自己完成載入類的功能,它只提供了一個時機。具體的載入程式碼還需要我們自己編寫程式碼實現。
多學一招spl_autoload_register() 實現類的自動載入除了__autoload()函式之外,spl_autoload_regiser()提供了一種更加靈活的方式來實現類的自動載入。 將上面的示例改用spl autoload regiser0函式來實現,程式碼如 例6-17所示。
例6-17
1 <?php 2 function loader($classname){ 3 require $classname . ".class.php"; 4 } 5 spl_autoload_register('loader'); 6 $obj1 = new MyClass1(); 7 $obj2 = new MyClass2(); 8 var_dump($obj1); 9 var_dump($obj2); 10 ?>
執行結果
由此證明 spl_autoload_register() 也可以實現類的自動載入
6.2 魔術方法
PHP中有很多以兩個下劃線開頭的方法.如前面介紹的_ _construct() __autolad() _get() 和_ set(). 這些方法被稱為魔術方法。
魔術方法有一個特點就是不需要手動呼叫,在某一時刻會自動執行。為程式的開發帶來了極大的便利。
在PHP中提供了多個魔術方法、接下來列舉這些常用的度術方法。如下表 所示
方法宣告 | 功能描述 |
__sleep() | 物件序列化之前被呼叫,使程式延緩一段時間執行。 |
__wakeup() | 物件序列化之前被呼叫,還原被序列化的物件。 |
__toString() | 輸出一個物件時被呼叫,將物件轉化為字串。 |
__call() | 在物件中呼叫一個不可訪問方法時會被呼叫。 |
__callStatic() | 用靜態方式中呼叫一個不可訪問方法時會被呼叫。 |
__clone() | 克隆物件時被呼叫。 |
__invoke() | 當嘗試以呼叫函式的方式呼叫一個物件時被呼叫 |
上表中列舉了PHP中的常用的魔術方法,這些方法在實際開發中會經常的使用,接下來以__toString() 為例 演示一下。
例6-18
1 <?php 2 class Person{ 3 private $name = "張三"; 4 private $age = 21; 5 public function __toString(){ 6 return "$this->name ($this->age)"; 7 } 8 } 9 $p1 = new Person(); 10 echo $p1; 11 ?>
執行結果
張三 (21)
在例6-18中。 定義了一個Person類,該類中有一個魔術方法,_toString(). 用於將當前物件的資訊以字串的形式返回。因此,建立Person 物件之後,就可以直接使用echo輸出$p1物件資訊。