PHP實現自動加載機制
php自動加載
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/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'); }
初步的自動加載就完成瞭
到此這篇關於PHP實現自動加載機制的文章就介紹到這瞭,更多相關PHP自動加載內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 分析Composer實現自動加載原理
- php自動加載代碼實例詳解
- 淺談Java自定義類加載器及JVM自帶的類加載器之間的交互關系
- thinkphp(php)插件鉤子(hooks)分析的簡單實現機制
- 解決vue中less的使用問題