很多開發人員寫物件導向的應用程式時對每個類的定義建立一個 PHP 源檔案。一個很大的煩惱是不得不在每個指令碼(每個類一個檔案)開頭寫一個長長的包含檔案清單。
在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。
http://www.php.net/manual/zh/language.oop5.autoload.php
使用良好定義的自動載入,你無需擔心一個類檔案相對於當前類檔案的什麼位置;你只要簡單的使用這個類,自動載入器將會執行檔案尋找任務。
另外,自動載入,因為它直到最後一刻才載入並確信匹配只出現一次,是一次巨大的效能提升——特別是在你部署之前如果花時間清除require_once()調用的時候
Zend Framework鼓勵使用自動載入,並提供許多工具提供庫代碼和應用程式代碼的自動載入
php自動載方法有兩種.
第一種方案用__autoload,這個函數較簡單,也較弱.
但有一問題沒有解決, 就是在include前判斷檔案是否存在的問題.
set_include_path('aa' . PATH_SEPARATOR . get_include_path());function __autoload($className){ //如果加這個檢測, 因為此檔案不在目前的目錄下,它就會檢測不到檔案存在, //但include是能成功的 if (file_exists($className . '.php')) { include_once($className . '.php'); } else { exit('no file'); }}$a = new Acls();
第二種方案用spl自動載入,這裡具體說一下這個.
spl_autoload_register()
一個簡單的例子
set_include_path('aa' . PATH_SEPARATOR . get_include_path());//function __autoload($className)//{// if (file_exists($className . '.php')) {// include_once($className . '.php');// } else {// exit('no file');// }//}spl_autoload_register();$a = new Acls();
spl_autoload_register()會自動先調用spl_autoload()在路徑中尋找具有小寫檔案名稱的".php"程式.預設尋找的副檔名還有".ini",還可以用spl_autoload_extenstions()註冊副檔名.
在找不到的清況下,還可以通過自己定義函數尋找
如
function loader1($class)
{
//自己寫一些載入的代碼
}
function loader2($class)
{
//當loader1()找不到時,我來找
}
spl_autoload_register('loader1');
spl_autoload_register('loader2');
還可以更多........
MVC架構是如何?自動載入的
首先設定路徑
'include' => array(
'application/catalog/controllers',
'application/catalog/models',
),
$include = array('application/controllers', 'application/models', 'application/library');
set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config['include']));
在擷取URL,解析出控制器與方法.
然後設定自動載入
class Loader{ /** * 自動載入類 * @param $class 類名 */ public static function autoload($class) { $path = ''; $path = str_replace('_', '/', $class) . '.php'; include_once($path); }}/** * sql自動載入 */spl_autoload_register(array('Loader', 'autoload'));
路由,執行個體化控制器,調用方法,你寫的東西就開始執行了
/** * 路由 */public function route(){ if (class_exists($this->getController())) { $rc = new ReflectionClass($this->getController()); if ($rc->hasMethod($this->getAction())) { $controller = $rc->newInstance(); $method = $rc->getMethod($this->getAction()); $method->invoke($controller); } else throw new Exception('no action'); } else throw new Exception('no controller');}