《PHP實(shí)例:PHP中的use關(guān)鍵字及文件的加載詳解》要點(diǎn):
本文介紹了PHP實(shí)例:PHP中的use關(guān)鍵字及文件的加載詳解,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
前言PHP實(shí)例
可能在大家經(jīng)常使用框架,寫一個(gè)Controller
或者Model
的時(shí)候,寫了好多use
,但是并沒(méi)有寫文件加載的代碼,就以為use可以進(jìn)行文件的自動(dòng)加載了.PHP實(shí)例
詳細(xì)介紹PHP實(shí)例
其實(shí),現(xiàn)在流行的php框架,都是基于MVC模式的,大量的使用了命名空間,以提高程序的靈活性.那么框架是怎么實(shí)現(xiàn)將use關(guān)鍵字所聲明的類庫(kù)對(duì)應(yīng)的腳本文件進(jìn)行加載的那?PHP實(shí)例
(1):在通過(guò)use
關(guān)鍵字進(jìn)行聲明類庫(kù)的聲明的時(shí)候,并不會(huì)進(jìn)行腳本的加載,而是在腳本文件真正使用到所對(duì)應(yīng)的類庫(kù)的時(shí)候才會(huì)進(jìn)行加載(這就是所謂延遲加載).PHP實(shí)例
(2):框架一般在初始化階段,就聲明了__autoload()
函數(shù)或者是spl_autoload_register()
函數(shù)(一般會(huì)在入口文件中進(jìn)行聲明).在調(diào)用通過(guò)use聲明的類庫(kù)的時(shí)候,會(huì)自動(dòng)的調(diào)用上述的函數(shù),將調(diào)用的類庫(kù)名稱傳遞到函數(shù)中(這里的類庫(kù)名稱是包括命名空間的全名稱)PHP實(shí)例
<?php namespace Home\Controller; function __autoload($class_name) { //echo $class_name."<br/>"; require_once ("./".$class_name . ".php"); } use Admin\Controller\Index; new Index; //new Index會(huì)觸發(fā)__autoload()函數(shù),返回Admin\Controller\Index到函數(shù)中 ?>
(3):框架中定義的__autoload()
函數(shù)或者是spl_autoload_register()
函數(shù)在接收到傳遞過(guò)來(lái)的類庫(kù)名稱以后,框架會(huì)對(duì)名稱進(jìn)行處理,分析出類庫(kù)名稱所對(duì)應(yīng)的文件路徑,然后進(jìn)行文件的加載.這里需要注意的是,不同的框架在解析類庫(kù)名稱,分析文件路徑的方式是各不一致的,畢竟各自的目錄結(jié)構(gòu)是不一樣的.PHP實(shí)例
比如說(shuō),thinkphp:PHP實(shí)例
/** * 類庫(kù)自動(dòng)加載 * @param string $class 對(duì)象類名 * @return void */ public static function autoload($class) { // 檢查是否存在映射 if(isset(self::$_map[$class])) { include self::$_map[$class]; }elseif(false !== strpos($class,'\\')){ $name = strstr($class, '\\', true); if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ // Library目錄下面的命名空間自動(dòng)定位 $path = LIB_PATH; }else{ // 檢測(cè)自定義命名空間 否則就以模塊為命名空間 $namespace = C('AUTOLOAD_NAMESPACE'); $path = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH; } $filename = $path . str_replace('\\', '/', $class) . EXT; if(is_file($filename)) { // Win環(huán)境下面嚴(yán)格區(qū)分大小寫 if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){ return ; } include $filename; } }elseif (!C('APP_USE_NAMESPACE')) { // 自動(dòng)加載的類庫(kù)層 foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){ if(substr($class,-strlen($layer))==$layer){ if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) { return ; } } } // 根據(jù)自動(dòng)加載路徑設(shè)置進(jìn)行嘗試搜索 foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){ if(import($path.'.'.$class)) // 如果加載類成功則返回 return ; } } }
這里只是舉例說(shuō)明use與文件的自動(dòng)加載沒(méi)有關(guān)系,不強(qiáng)調(diào)各個(gè)框架是具體怎么完成自動(dòng)加載,具體的可以自己看框架代碼進(jìn)行研究.PHP實(shí)例
總結(jié)PHP實(shí)例
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流.PHP實(shí)例
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/2576.html