PHP中的use關(guān)鍵字及文件的加載詳解
前言
可能在大家經(jīng)常使用框架,寫一個Controller或者Model的時候,寫了好多use,但是并沒有寫文件加載的代碼,就以為use可以進行文件的自動加載了。
詳細介紹
其實,現(xiàn)在流行的php框架,都是基于MVC模式的,大量的使用了命名空間,以提高程序的靈活性。那么框架是怎么實現(xiàn)將use關(guān)鍵字所聲明的類庫對應的腳本文件進行加載的那?
(1):在通過use關(guān)鍵字進行聲明類庫的聲明的時候,并不會進行腳本的加載,而是在腳本文件真正使用到所對應的類庫的時候才會進行加載(這就是所謂延遲加載)。
(2):框架一般在初始化階段,就聲明了__autoload()函數(shù)或者是spl_autoload_register()函數(shù)(一般會在入口文件中進行聲明)。在調(diào)用通過use聲明的類庫的時候,會自動的調(diào)用上述的函數(shù),將調(diào)用的類庫名稱傳遞到函數(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會觸發(fā)__autoload()函數(shù),返回Admin\Controller\Index到函數(shù)中
?>
(3):框架中定義的__autoload()函數(shù)或者是spl_autoload_register()函數(shù)在接收到傳遞過來的類庫名稱以后,框架會對名稱進行處理,分析出類庫名稱所對應的文件路徑,然后進行文件的加載。這里需要注意的是,不同的框架在解析類庫名稱,分析文件路徑的方式是各不一致的,畢竟各自的目錄結(jié)構(gòu)是不一樣的。
比如說,thinkphp:
/**
* 類庫自動加載
* @param string $class 對象類名
* @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目錄下面的命名空間自動定位
$path = LIB_PATH;
}else{
// 檢測自定義命名空間 否則就以模塊為命名空間
$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)境下面嚴格區(qū)分大小寫
if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){
return ;
}
include $filename;
}
}elseif (!C('APP_USE_NAMESPACE')) {
// 自動加載的類庫層
foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){
if(substr($class,-strlen($layer))==$layer){
if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {
return ;
}
}
}
// 根據(jù)自動加載路徑設置進行嘗試搜索
foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){
if(import($path.'.'.$class))
// 如果加載類成功則返回
return ;
}
}
}
這里只是舉例說明use與文件的自動加載沒有關(guān)系,不強調(diào)各個框架是具體怎么完成自動加載,具體的可以自己看框架代碼進行研究。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
- php類中的$this,static,final,const,self這幾個關(guān)鍵字使用方法
- PHP面向?qū)ο蟮倪M階學習(抽像類、接口、final、類常量)
- PHP 面向?qū)ο?final類與final方法
- php面向?qū)ο笕ヂ?(十) final static const關(guān)鍵字的使用
- php中static和const關(guān)鍵字用法分析
- 詳解PHP中instanceof關(guān)鍵字及instanceof關(guān)鍵字有什么作用
- PHP中static關(guān)鍵字以及與self關(guān)鍵字的區(qū)別
- php中final關(guān)鍵字用法分析
相關(guān)文章
PHP 雜談《重構(gòu)-改善既有代碼的設計》之三 重新組織數(shù)據(jù)
承接上文的PHP 雜談《重構(gòu)-改善既有代碼的設計》之 重新組織你的函數(shù)繼續(xù)重構(gòu)方面的內(nèi)容2012-04-04
安裝ImageMagick出現(xiàn)error while loading shared libraries的解決方法
這篇文章主要介紹了安裝ImageMagick出現(xiàn)error while loading shared libraries的解決方法,是ImageMagick安裝與運行中經(jīng)常出現(xiàn)的問題,需要的朋友可以參考下2014-09-09
js+php實現(xiàn)靜態(tài)頁面實時調(diào)用用戶登陸狀態(tài)的方法
這篇文章主要介紹了js+php實現(xiàn)靜態(tài)頁面實時調(diào)用用戶登陸狀態(tài)的方法,采用在靜態(tài)頁面中使用js調(diào)用php頁面從而實現(xiàn)用戶登錄狀態(tài)的實時調(diào)用功能,需要的朋友可以參考下2015-01-01
php實現(xiàn)數(shù)字轉(zhuǎn)億萬單位的示例代碼
這篇文章主要為大家詳細介紹了php如何實現(xiàn)數(shù)字轉(zhuǎn)億萬單位,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下2023-11-11
PHP實現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法
這篇文章主要介紹了PHP實現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法,以實例形式分別介紹了php數(shù)組與字符串的轉(zhuǎn)換技巧,非常簡單實用,需要的朋友可以參考下2015-08-08

