淺談laravel aliases別名的原理
在laravel發(fā)現(xiàn)有些類可以直接use 類名,就能使用了,例如use DB;就可以使用DB類了,問題是DB這個類并不在根命名空間,這里面實際就是用到了別名。
先通過如下例子來分析基本原理
建立如下文件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的時候 并沒有new \test\test2\upload 而是直接new \upload,原因不多說,就是因為函數(shù)class_alias導(dǎo)致的.具體的這個函數(shù)的用法可以參考手冊。這里要補充說明class_alias的第3個參數(shù)默認(rèn)為true,手冊上的意思是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的別名實現(xiàn)機制了.
在laravel中,比方說我需要使用Log類,我們通過use Log; Log::info();就能使用記錄日志了.下面來分析原理
laravel的加載過程這里不分析,中間有一步會執(zhí)行如下這個'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的配置文件,這個配置文件里面我們定義了別名列表.
意思就是說如果是需要使用別名 ,必須在配置文件中注冊別名
例如配置文件中有一行配置為'Log' => Illuminate\Support\Facades\Log::class,
繼續(xù)追蹤執(zhí)行流程,代碼會執(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,實際上是調(diào)用的Illuminate\Support\Facades\Log這個類, 可是Illuminate\Support\Facades\Log里并沒有info方法,這是如何實現(xiàn)的了,可以百度facade原理,這里不細(xì)說,這里實際上調(diào)用的是是從容器里面獲取到了log對象,那么這個log對象是什么時候注冊到容器里面去的了,
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這個文件里就會將log注冊到容器里面.這樣一個完整的流程就結(jié)束了
以上這篇淺談laravel aliases別名的原理就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Laravel6.2中用于用戶登錄的新密碼確認(rèn)流程詳解
- Laravel 5框架學(xué)習(xí)之模型、控制器、視圖基礎(chǔ)流程
- Laravel 5.4重新登錄實現(xiàn)跳轉(zhuǎn)到登錄前頁面的原理和方法
- Laravel中間件實現(xiàn)原理詳解
- Laravel模型事件的實現(xiàn)原理詳解
- 淺談Laravel隊列實現(xiàn)原理解決問題記錄
- Laravel框架隊列原理與用法分析
- Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解
- Laravel框架生命周期與原理分析
- laravel框架模型中非靜態(tài)方法也能靜態(tài)調(diào)用的原理分析
- laravel 框架執(zhí)行流程與原理簡單分析
相關(guān)文章
Yii2實現(xiàn)讓關(guān)聯(lián)字段支持搜索功能的方法
這篇文章主要介紹了Yii2實現(xiàn)讓關(guān)聯(lián)字段支持搜索功能的方法,結(jié)合實例形式分析了Yii2關(guān)聯(lián)字段搜索功能的原理與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-08-08
TP5(thinkPHP5框架)實現(xiàn)顯示錯誤信息及行號功能的方法
這篇文章主要介紹了TP5(thinkPHP5框架)實現(xiàn)顯示錯誤信息及行號功能的方法,結(jié)合實例形式分析了thinkPHP5顯示錯誤信息及行號的相關(guān)配置文件與設(shè)置修改方法,需要的朋友可以參考下2019-06-06
Laravel 讀取 config 下的數(shù)據(jù)方法
今天小編就為大家分享一篇Laravel 讀取 config 下的數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
如何使用純PHP實現(xiàn)定時器任務(wù)(Timer)
本文主要介紹了如何使用純PHP實現(xiàn)純粹的定時器任務(wù),且能適應(yīng)認(rèn)識任務(wù)業(yè)務(wù)需求,需要的朋友可以參考下2015-07-07
php將url地址轉(zhuǎn)化為完整的a標(biāo)簽鏈接代碼(php為url地址添加a標(biāo)簽)
這篇文章主要介紹了php為url地址添加a標(biāo)簽的示例,大家參考使用吧2014-01-01

