濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > 淺談laravel aliases別名的原理

淺談laravel aliases別名的原理

熱門標(biāo)簽:泊頭在哪里辦理400電話 高德地圖標(biāo)注位置怎么標(biāo)注 天潤(rùn)融通外呼系統(tǒng)好嗎 江西電銷機(jī)器人收費(fèi) 高德地圖標(biāo)注店鋪收費(fèi)嗎 江門回?fù)芡夂粝到y(tǒng) 欣思維地圖標(biāo)注 電銷機(jī)器人沒有效果怎么樣 杭州語音電銷機(jī)器人

在laravel發(fā)現(xiàn)有些類可以直接use 類名,就能使用了,例如use DB;就可以使用DB類了,問題是DB這個(gè)類并不在根命名空間,這里面實(shí)際就是用到了別名。

先通過如下例子來分析基本原理

建立如下文件upload.php,內(nèi)容為

?php
namespace test\test2;
class upload{
 public function test(){
 return 123;
 }
}

2 建立文件index.php,內(nèi)容為

?php
namespace b;
require('upload.php');
class_alias ( '\test\test2\upload' , 'upload');
$a=new \upload();
echo $a->test(); 

瀏覽器執(zhí)行index.php,成功輸出結(jié)果123;

可以看到class upload在命名空間test\test2下 但是new upload的時(shí)候 并沒有new \test\test2\upload 而是直接new \upload,原因不多說,就是因?yàn)楹瘮?shù)class_alias導(dǎo)致的.具體的這個(gè)函數(shù)的用法可以參考手冊(cè)。這里要補(bǔ)充說明class_alias的第3個(gè)參數(shù)默認(rèn)為true,手冊(cè)上的意思是Whether to autoload if the original class is not found.是什么意思了,還是通過例子說明 ,把index.php修改如下

?php
namespace b;
//require('upload.php');
spl_autoload_register(function($class){
$num=strrpos($class,'\\');
$num++;
$file=substr($class, $num).'.php';
require($file);
});
 
class_alias ( '\test\test2\upload' , 'upload');
$a=new \upload();
echo $a->test();

可以看到我注釋掉了require('upload.php'),但是代碼還是成功執(zhí)行了。有了上面的例子說明,就能看懂laravel的別名實(shí)現(xiàn)機(jī)制了.

在laravel中,比方說我需要使用Log類,我們通過use Log; Log::info();就能使用記錄日志了.下面來分析原理

laravel的加載過程這里不分析,中間有一步會(huì)執(zhí)行如下這個(gè)'Illuminate\Foundation\Bootstrap\RegisterFacades'的bootstrap方法;

class RegisterFacades 
{ 
  public function bootstrap(Application $app) 
  { 
    //......省略...... 
    AliasLoader::getInstance($app->make('config')->get('app.aliases'))->register(); 
  } 
}

$app->make('config')->get('app.aliases')這一步讀取了config文件夾下的app.php的配置文件,這個(gè)配置文件里面我們定義了別名列表.

意思就是說如果是需要使用別名 ,必須在配置文件中注冊(cè)別名

例如配置文件中有一行配置為'Log' => Illuminate\Support\Facades\Log::class,

繼續(xù)追蹤執(zhí)行流程,代碼會(huì)執(zhí)行到這一步

public function load($alias) 
{ 
  if (isset($this->aliases[$alias])) { 
    return class_alias($this->aliases[$alias], $alias); 
  } 
}

到了這里 ,看了之前的原理的人應(yīng)該都明白了,我們new Log類 ,根據(jù)我們的配置'Log' => Illuminate\Support\Facades\Log::class,實(shí)際上是調(diào)用的Illuminate\Support\Facades\Log這個(gè)類, 可是Illuminate\Support\Facades\Log里并沒有info方法,這是如何實(shí)現(xiàn)的了,可以百度facade原理,這里不細(xì)說,這里實(shí)際上調(diào)用的是是從容器里面獲取到了log對(duì)象,那么這個(gè)log對(duì)象是什么時(shí)候注冊(cè)到容器里面去的了,

protected $bootstrappers = [ 
  'Illuminate\Foundation\Bootstrap\DetectEnvironment', 
  'Illuminate\Foundation\Bootstrap\LoadConfiguration', 
  'Illuminate\Foundation\Bootstrap\ConfigureLogging', 
  'Illuminate\Foundation\Bootstrap\HandleExceptions', 
  'Illuminate\Foundation\Bootstrap\RegisterFacades', 
  'Illuminate\Foundation\Bootstrap\RegisterProviders', 
  'Illuminate\Foundation\Bootstrap\BootProviders', 
]; 

這塊代碼,看過源碼的人都應(yīng)該熟悉了,在ConfigureLogging這個(gè)文件里就會(huì)將log注冊(cè)到容器里面.這樣一個(gè)完整的流程就結(jié)束了

以上這篇淺談laravel aliases別名的原理就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Laravel6.2中用于用戶登錄的新密碼確認(rèn)流程詳解
  • Laravel 5框架學(xué)習(xí)之模型、控制器、視圖基礎(chǔ)流程
  • Laravel 5.4重新登錄實(shí)現(xiàn)跳轉(zhuǎn)到登錄前頁面的原理和方法
  • Laravel中間件實(shí)現(xiàn)原理詳解
  • Laravel模型事件的實(shí)現(xiàn)原理詳解
  • 淺談Laravel隊(duì)列實(shí)現(xiàn)原理解決問題記錄
  • Laravel框架隊(duì)列原理與用法分析
  • Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解
  • Laravel框架生命周期與原理分析
  • laravel框架模型中非靜態(tài)方法也能靜態(tài)調(diào)用的原理分析
  • laravel 框架執(zhí)行流程與原理簡(jiǎn)單分析

標(biāo)簽:駐馬店 石嘴山 內(nèi)江 大同 雙鴨山 深圳 江門

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談laravel aliases別名的原理》,本文關(guān)鍵詞  淺談,laravel,aliases,別名,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談laravel aliases別名的原理》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談laravel aliases別名的原理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    苍山县| 仁寿县| 海伦市| 乌鲁木齐市| 罗城| 黄龙县| 手游| 南城县| 娱乐| 应城市| 泗阳县| 江北区| 抚顺市| 荣成市| 弥勒县| 尖扎县| 固原市| 印江| 尼勒克县| 高邑县| 乌兰浩特市| 广水市| 泸州市| 遂宁市| 正阳县| 宁德市| 沁源县| 平利县| 来宾市| 启东市| 雷山县| 辛集市| 申扎县| 南开区| 石首市| 阜平县| 克东县| 高青县| 鹿邑县| 汉川市| 应城市|