国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP中的use關鍵字及文件的加載詳解

2024-05-04 23:52:58
字體:
來源:轉載
供稿:網友

前言

可能在大家經常使用框架,寫一個Controller或者Model的時候,寫了好多use,但是并沒有寫文件加載的代碼,就以為use可以進行文件的自動加載了。

詳細介紹

其實,現在流行的php框架,都是基于MVC模式的,大量的使用了命名空間,以提高程序的靈活性。那么框架是怎么實現將use關鍵字所聲明的類庫對應的腳本文件進行加載的那?

(1):在通過use關鍵字進行聲明類庫的聲明的時候,并不會進行腳本的加載,而是在腳本文件真正使用到所對應的類庫的時候才會進行加載(這就是所謂延遲加載)。

(2):框架一般在初始化階段,就聲明了__autoload()函數或者是spl_autoload_register()函數(一般會在入口文件中進行聲明)。在調用通過use聲明的類庫的時候,會自動的調用上述的函數,將調用的類庫名稱傳遞到函數中(這里的類庫名稱是包括命名空間的全名稱)

<?phpnamespace Home/Controller;function __autoload($class_name) {  //echo $class_name."<br/>";  require_once ("./".$class_name . ".php");  }use Admin/Controller/Index;new Index; //new Index會觸發__autoload()函數,返回Admin/Controller/Index到函數中?>

(3):框架中定義的__autoload()函數或者是spl_autoload_register()函數在接收到傳遞過來的類庫名稱以后,框架會對名稱進行處理,分析出類庫名稱所對應的文件路徑,然后進行文件的加載。這里需要注意的是,不同的框架在解析類庫名稱,分析文件路徑的方式是各不一致的,畢竟各自的目錄結構是不一樣的。

比如說,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環境下面嚴格區分大小寫    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 ;     }    }      }   // 根據自動加載路徑設置進行嘗試搜索   foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){    if(import($path.'.'.$class))     // 如果加載類成功則返回     return ;   }  } }

這里只是舉例說明use與文件的自動加載沒有關系,不強調各個框架是具體怎么完成自動加載,具體的可以自己看框架代碼進行研究。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 云霄县| 阿瓦提县| 淅川县| 贵南县| 古浪县| 祥云县| 永修县| 建宁县| 施甸县| 达尔| 梅河口市| 龙口市| 泌阳县| 桂东县| 安陆市| 禹城市| 哈尔滨市| 丹东市| 尼勒克县| 长宁县| 成安县| 大渡口区| 巴彦县| 阜宁县| 祁阳县| 南木林县| 扶余县| 江永县| 桐庐县| 宁陵县| 庄河市| 宁都县| 敦化市| 乐亭县| 泾阳县| 芜湖市| 黄冈市| 波密县| 环江| 灵川县| 静宁县|