天天看點

spl_autoload_register()和__autoload()2

這也是OO設計的基本思想之一。在PHP5之前,如果需要使用一個類,隻需要直接使用include/require将其包含進來即可。下面是一個實際的例子: 

1 class ClassA{ 
 2     public function __construct(){ 
 3         echo “ClassA load success!”; 
 4     } 
 5 } 
 6 //定義一個類ClassA,檔案名為ClassA.php 
 7 class ClassA{ 
 8     public function __construct(){ 
 9         echo “ClassA load success!”; 
10     } 
11 } 
12 class ClassB extends ClassA { 
13     public function __construct(){ 
14         //parent::__construct(); 
15         echo “ClassB load success!”; 
16     } 
17 } 
18 //定義一個類ClassB,檔案名為ClassB.php,ClassB繼承ClassA 
19 class ClassB extends ClassA { 
20     public function __construct(){ 
21         //parent::__construct(); 
22         echo “ClassB load success!”; 
23     } 
24 } 
25 //定義兩個測試用的類之後,我們來編寫一個含有__autoload()方法的PHP運作程式檔案如下: 
26 function __autoload($classname){ 
27     $classpath=”./”.$classname.'.php'; 
28     if(file_exists($classpath)){ 
29         require_once($classpath); 
30     } else{ 
31         echo ‘class file'.$classpath.'not found!'; 
32     } 
33 } 
34 
35 $newobj = new ClassA(); 
36 $newobj = new ClassB();       

這個檔案的運作是一點問題都沒有的.

但是不得不提醒你一下幾個方面是必須要注意的。 

1、如果類存在繼承關系(例如:ClassB extends ClassA),并且ClassA不在ClassB所在目錄 

利用__autoload魔術函數執行個體化ClassB的時候就會受到一個緻命錯誤: 

Fatal error: Class ‘Classd' not found in ……ClassB.php on line 2, 

解決方法:把所有存在extends關系的類放在同一個檔案目錄下,或者在執行個體化一個繼承類的時候在檔案中手工包含被繼承的類; 

2、另外一個需要注意的是,類名和類的檔案名必須一緻,才能更友善的使用魔術函數__autoload; 

3、在CLI模式下運作PHP腳本的話這個方法無效; 

4、如果你的類名稱和使用者的輸入有關——或者依賴于使用者的輸入,一定要注意檢查輸入的檔案名,例如:.././這樣的檔案名是非常危險的。