1. 程式人生 > >淺談PHP面向物件程式設計(六)

淺談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物件資訊。