成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? PHP中的use關鍵字及文件的加載詳解
全站頭部文字 我要出現在這里
PHP中的use關鍵字及文件的加載詳解 717 2024-01-10   

前言

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

詳細介紹

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

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

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

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

(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與文件的自動加載沒有關系,不強調各個框架是具體怎么完成自動加載,具體的可以自己看框架代碼進行研究。

總結

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



主站蜘蛛池模板: 在线观看高清电影| 二年级上学期口算题| 初恋在线观看| 职业探索怎么写| 色在线视频观看| 美式壁纸| 人民日报评墨茶| 宁波电视台| 吻激情| 操范冰冰| 中医把脉| 哥谭骑士| 打开双腿扒开打屁股羞辱惩罚视频 | x档案第二季| 老大不小在线观看免费完整版| city of stars歌词| 黄视频免费网站| juliet stevenson| 双重火力电影| 验光单子的数据怎么看| 张艾嘉董子健吻戏| 视频污污| 爱情天梯| 生死相随| 梁修身| 安浦清子| 角膜塑形镜的价格| 吴燕妮个人资料简介| 数字记忆法编码100| 苍兰| 雪山飞狐之塞北宝藏演员表| 我和我的父辈 电影| 假男假女 电影| 大学生搜| 男人不可以穷演员表| 舌尖上的中国4| 包青天之白玉堂传奇| 都市频道在线直播| 电影白日梦2| 新三国高清在线观看| dearestblue动漫免费观看|

!!!站長長期在線接!!!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103