溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中use關(guān)鍵字的作用有哪些

發(fā)布時間:2021-01-13 15:56:06 來源:億速云 閱讀:213 作者:Leah 欄目:開發(fā)技術(shù)

PHP中use關(guān)鍵字的作用有哪些?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

詳細介紹

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

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

(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ù)在接收到傳遞過來的類庫名稱以后,框架會對名稱進行處理,分析出類庫名稱所對應(yīng)的文件路徑,然后進行文件的加載。這里需要注意的是,不同的框架在解析類庫名稱,分析文件路徑的方式是各不一致的,畢竟各自的目錄結(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ù)自動加載路徑設(shè)置進行嘗試搜索
   foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){
    if(import($path.'.'.$class))
     // 如果加載類成功則返回
     return ;
   }
  }
 }

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

看完上述內(nèi)容,你們掌握PHP中use關(guān)鍵字的作用有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI