<?php
導語:
在實際項目中,如果一個類在多個腳本中都需要使用的話,可以将這個類的定義代碼,單獨的放到一個檔案内。
當需要的時候,将檔案加載進來即可。
目标:
在加載類檔案的時候,我們希望的情況是,首先,不需要手動加載該類檔案(自動加載)。
其次,按需加載(需要哪個類檔案就加載哪個類檔案,不需要的時候不加載)
/·······················································/
如何實作類檔案的自動加載:
第一步:
一般的我們會将類檔案的檔案名,命名為:類名.class.php
第二步:
我們需要借助__autoload()方法來實作類檔案自動加載。
在php執行的過程中,如果發現需要使用一個類,并且此時目前腳本并沒有這個類的定義代碼。
那麼php會自動調用__autoload()函數。并且在調用的同時,給該函數傳遞一個參數。參數就是目前需要的類的類名。
但是,系統隻負責調用該方法,并不負責定義這個函數,是以需要我們去完善函數體。
$obj = new A;
function __autoload($class_name){
if(is_file("./$class_name.class.php")){
include_once("./$class_name.class.php");
}
}
/·······················································/
随着項目的擴充,我們可能需要注冊其他自定義的自動加載函數。
第一步:定義一個可以加載類檔案的普通函數
例如:
function my_autoload($class_name){
if(is_file("./$class_name.class.php")){
include_once("./$class_name.class.php");
}
}
第二步:将該函數注冊成自動加載函數
這一步,我們需要借助另外一個系統函數來實作。
文法格式為:spl_autoload_register('函數名')
例如:
spl_autoload_register('my_autoload');
注冊其他自定義自動加載函數,有幾點需要注意的地方:
第一:注冊一定要發生在需要某個類之前
第二:可以注冊多個其他自定義自動加載函數
第三:一旦注冊其他自定義的自動加載函數之後,系統的自動加載函數__autolaod将失效
第四:如果還需要__autoload起作用,可以像注冊其他普通函數一樣注冊它
/·······················································/
在面向對象的程式設計風格中,我們一般會将使用者自定義的自動加載函數封裝到一個類中!
靜态方法注冊:
spl_autoload_register(array('類名','方法名'));
或者:
spl_autoload_register('類名::靜态方法名');
例如:
class Common{
public static function my_autoload($class_name){
if(is_file("./$class_name.class.php")){
include_once("./$class_name.class.php");
}
}
}
spl_autoload_register(array('Common','my_autoload'));
或者:
spl_autoload_register('Common::my_autoload');
非靜态方法注冊:
spl_autoload_register(array(對象變量,'方法名'));
例如:
class Common{
public function my_autoload($class_name){
if(is_file("./$class_name.class.php")){
include_once("./$class_name.class.php");
}
}
}
$obj = new Common;
spl_autoload_register(array($obj, 'my_autoloads'));