開發面向對象的應用程序時,往往要對每個類的定義建立一個 PHP 源文件。這樣的做法產生的一個很大的煩惱就是不得不在每個腳本(每個類一個文件)開頭寫一個長長的包含文件的列表。
在PHP開發的系統中,當在一個文件中需要調用另一個PHP文件中聲明的類時,就需要通過include或require把這個文件引入。不過有的時候,在文件眾多的項目中,要一一將所需類的文件都包含進來,是一個讓人很頭疼的事,所以我們能不能在用到什么類的時候,再把這個類所在的php文件導入呢?這就是我們這里我們要講的自動加載類。
在 PHP 5 中,可以定義一個 __autoload()函數,它會在試圖使用尚未被定義的類時自動調用,通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類, __autoload()函數接收的一個參數,就是你想加載的類的類名,所以你做項目時,在組織定義類的文件名時,需要按照一定的規則,最好以類名為中心,也可以加上統一的前綴或后綴形成文件名,比如 xxx_classname.php、classname_xxx.php以及就是classname.php等等。
我們以一個例子來說明一下__autoload 的使用方法,下面分別從 ClassA.php 和 ClassB.php 文件中加載 ClassA 和 ClassB 類
- <?php
- //定義一個類ClassA,文件名為ClassA.php
- class ClassA{
- public function __construct(){
- echo "ClassA load success!";
- }
- }
- ?>
- <?php
- //定義一個類ClassB,文件名為ClassB.php,ClassB繼承ClassA
- class ClassB extends ClassA {
- public function __construct(){
- echo "ClassB load success!";
- }
- }
- ?>
- <?php
- function __autoload($classname)
- {
- $classpath="./".$classname.'.php';
- if(file_exists($classpath)){
- require_once($classpath);
- }
- else{
- echo 'class file'.$classpath.'not found!';
- }
- }
- //ClassA類不存在時,自動調用__autoload()函數,傳入參數”ClassA”
- $obj = new ClassA();
- //ClassB類不存在時,自動調用__autoload()函數,傳入參數”ClassB”
- $obj2 = new ClassB();
- ?>
能過上面的例子,我們發現在使用ClassA和ClassB時,我們并沒有手動引入ClassA.php和ClassB.php文件,但卻能正常使用這兩個類,可見__autoload是多么地好用。
但在使用__autoload時也要注意一些問題,比如上面的ClassB類,它是繼承了ClassA類,如果這時ClassA和ClassB不在同一個目錄時就會出錯,所以建議把所有存在extends關系的類放在同一個文件目錄下,或者在實例化一個繼承類的時候在文件中手工包含被繼承的類。還有一點就是在使用自動載入函數時一定要注意類名與文件名的對應關系。
新聞熱點
疑難解答