亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Laravel中Facade的加載過程與原理詳解

2024-05-05 00:00:14
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于Laravel中Facade加載過程與原理的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

簡介

Facades(讀音:/f??säd/ )為應用程序的 服務容器 中可用的類提供了一個「靜態」接口。你不必 use 一大串的命名空間,也不用實例化對象,就能訪問對象的具體方法。

use Config;class Test{ public function index() { return Config::get('app.name'); }}

Facade 的啟動與注冊

Facade 的啟動引導是在 Illuminate/Foundation/Bootstrap/RegisterFacades 中注冊的。

public function bootstrap(Application $app){ Facade::clearResolvedInstances(); Facade::setFacadeApplication($app); AliasLoader::getInstance(array_merge( $app->make('config')->get('app.aliases', []), $app->make(PackageManifest::class)->aliases() ))->register();}

默認的別名配置是從 app 配置文件下的 aliases 讀取的,PackageManifest 是 laravel 5.5 新增的 包自動發現 規則,這里我們暫時不考慮 PackageManifest 包提供的別名。

其中,array_merge 返回如下格式的數組:

 "App" => "Illuminate/Support/Facades/App" "Artisan" => "Illuminate/Support/Facades/Artisan" "Auth" => "Illuminate/Support/Facades/Auth" "Blade" => "Illuminate/Support/Facades/Blade" ...

上面代碼將通過 AliasLoader 把所有的 facade 注冊進自動加載。其核心就是 php 的 spl_autoload_register。

 /** * Prepend the load method to the auto-loader stack. * * @return void */ protected function register() { if (! $this->registered) {  spl_autoload_register([$this, 'load'], true, true);  $this->registered = true; } }

注冊完成后,后續所有 use 的類都將通過 load 函數來完成類的自動加載。

注意:這里在定義 spl_autoload_register 時,最后面的參數傳的是 true。當該參數是 true 時,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。(優先通過該函數來完成自動加載)

也就是說,

<?phpuse Config;use App/User;class Test{ public function index() { Config::get('app.name'); new User(); }}

不管我們 use 的是具體存在的類(App/User)還是別名 (Config),都將最先通過 load 函數來完成自動加載,當該函數返回 false 時,再由其他自動加載函數來完成自動加載(如 composer psr-4)。

在 AliasLoader 的 load 方法中,主要是用了 class_alias 函數來實現的別名自動加載。

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

關于 class_alias 這里帖一個官方的列子:

class foo { }class_alias('foo', 'bar');$a = new foo;$b = new bar;// the objects are the samevar_dump($a == $b, $a === $b); //truevar_dump($a instanceof $b); //false// the classes are the samevar_dump($a instanceof foo); //truevar_dump($a instanceof bar); //truevar_dump($b instanceof foo); //truevar_dump($b instanceof bar); //true

Facade 的加載

當我們在使用 Facade 時,如:

<?phpuse Config;class Test{ public function index() { Config::get('app.name'); }}

實際上加載的是 Illuminate/Support/Facades/Config 類(因為我們已經注冊了 class_alias),相當于:

<?phpuse Illuminate/Support/Facades/Config;class Test{ public function index() {  Config::get('app.name'); }}

而所有的 Facade 都繼承自 Illuminate/Support/Facades/Facade 類,在該基類中定義了一個 __callStatic 方法,已至于我們能夠輕松地使用 Facade(不用實列化)。

<?phppublic static function __callStatic($method, $args){ $instance = static::getFacadeRoot(); if (! $instance) {  throw new RuntimeException('A facade root has not been set.'); } return $instance->$method(...$args);}

getFacadeRoot 方法用于獲取別名類的具體實列,我們知道,所有的 Facade 類都需要定義一個 getFacadeAccessor 方法。該方法可能的返回值有:

  • String 類型的字符串(如 config, db)
  • String 類型的類字符串 (如 App/Service/SomeService)
  • Object 具體的實列化對象
  • Closure 閉包

如 Config Facade 的 getFacadeAccessor 方法如下:

protected static function getFacadeAccessor(){ return 'config';} 

getFacadeRoot 方法將根據 getFacadeAccessor() 的返回值,從容器從取出對應的實列對象。

public static function getFacadeRoot(){ $name = static::getFacadeAccessor();  if (is_object($name)) {  return $name; } if (isset(static::$resolvedInstance[$name])) {  return static::$resolvedInstance[$name]; } return static::$resolvedInstance[$name] = static::$app[$name];}

由于 APP 容器中已經注冊過 config 的實列

<?php//Illuminate/Foundation/Bootstrap/LoadConfiguration$app->instance('config', $config = new Repository($items));

所以 /Config::get('app.name', 'dafault) 實際訪問的是 Repository 實列的 get('app.name', 'default') 方法。

總結

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


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网站色ww在线| 欧美在线亚洲在线| 欧美三级欧美成人高清www| 亚洲男人的天堂在线播放| 91色p视频在线| 日韩精品在线私人| 懂色av影视一区二区三区| 亚洲免费中文字幕| 久久久久久网址| 久久精品国产一区二区电影| 色综合视频一区中文字幕| 欧美日韩性视频在线| 欧美丰满老妇厨房牲生活| 97欧美精品一区二区三区| 欧美性猛交丰臀xxxxx网站| 欧美精品性视频| 91精品国产自产在线观看永久| 97在线视频国产| 成人午夜一级二级三级| 国产精品久久久久久av福利软件| 亚洲第一免费网站| 欧美性色xo影院| 国产精品三级网站| 欧美肥老太性生活视频| 岛国av一区二区在线在线观看| 亚洲综合中文字幕在线| 91亚洲国产成人精品性色| 成人国内精品久久久久一区| 在线观看欧美成人| 亚洲国产精品字幕| 亚洲精品第一国产综合精品| 日韩h在线观看| 亚洲wwwav| 国产中文字幕亚洲| 亚洲福利在线播放| 欧美国产视频日韩| 亚洲第一av网| 国内精品久久久| 欧美亚洲国产日本| 成人福利免费观看| 超碰精品一区二区三区乱码| 亚洲精品国产精品乱码不99按摩| 亚洲精品美女久久久| 最近2019中文字幕第三页视频| 亚洲欧美国产制服动漫| 欧美精品情趣视频| 欧美老少配视频| 欧美大码xxxx| 久久不射热爱视频精品| 2024亚洲男人天堂| 91精品国产91久久久久久最新| 久久精品国产2020观看福利| 欧美激情va永久在线播放| 国产一区二区三区在线看| 国产91精品青草社区| 国产精品久久99久久| 日韩av色综合| 日本不卡高字幕在线2019| 亚洲qvod图片区电影| 91精品久久久久久久久久久久久| 欧美性生交大片免费| 久久久久久久久久婷婷| 国产成人在线精品| 精品国产一区二区三区久久狼黑人| 8x海外华人永久免费日韩内陆视频| 国产国语videosex另类| 一区二区三区四区在线观看视频| 欧美日韩美女视频| 性欧美办公室18xxxxhd| 精品成人乱色一区二区| 国产精品久久久| 成人羞羞国产免费| 国产精品丝袜白浆摸在线| 中文字幕久久精品| 欧美日韩在线观看视频小说| 伊人久久男人天堂| 国产欧美一区二区三区久久| 黑人巨大精品欧美一区二区一视频| 亚洲精美色品网站| zzijzzij亚洲日本成熟少妇| 精品精品国产国产自在线| 91久久综合亚洲鲁鲁五月天| 久久夜色撩人精品| 一区二区三区四区精品| 亚洲电影免费观看高清完整版| 久久精品国产96久久久香蕉| 欧美日韩一区免费| 亚洲综合色激情五月| 久久电影一区二区| 一个人www欧美| 高清亚洲成在人网站天堂| 自拍视频国产精品| 亚洲国产古装精品网站| 国产欧美精品日韩精品| 国产精品久久久久久久久久ktv| 国产香蕉精品视频一区二区三区| 成人av资源在线播放| 日韩亚洲综合在线| 亚洲第一男人天堂| 国产精品久久久精品| 97超级碰碰人国产在线观看| 亚洲精品久久视频| 91成品人片a无限观看| 91精品国产91久久久久久吃药| 最近免费中文字幕视频2019| 亚洲第一男人av| 91精品美女在线| 亚洲第一网中文字幕| 国产精品999| 中文字幕9999| 综合国产在线视频| 亚洲欧美综合另类中字| 高清欧美性猛交xxxx黑人猛交| 黑人精品xxx一区一二区| 粉嫩老牛aⅴ一区二区三区| 亚洲精品720p| 亚洲欧美精品伊人久久| 欧美成人国产va精品日本一级| 国产精品18久久久久久麻辣| 色婷婷久久一区二区| 97在线观看视频国产| 色偷偷偷亚洲综合网另类| 欧美一区二区三区精品电影| 精品二区三区线观看| 亚洲小视频在线观看| 欧美精品中文字幕一区| 久久综合久中文字幕青草| 国产中文日韩欧美| 久久天天躁狠狠躁夜夜躁2014| 91免费看片在线| 欧美精品久久久久a| 精品国产区一区二区三区在线观看| 亚洲国产精品人人爽夜夜爽| 欧美亚洲激情在线| 国产欧美一区二区三区视频| 亚洲欧美日韩综合| 久久久亚洲天堂| 午夜精品一区二区三区在线播放| 国产一区二中文字幕在线看| 97视频在线观看亚洲| 亚洲自拍偷拍在线| 亚洲精品第一国产综合精品| 一本一本久久a久久精品牛牛影视| 欧美成人一区在线| 欧美成人午夜激情视频| 一本色道久久88亚洲综合88| 国模极品一区二区三区| 欧美在线一级va免费观看| 日韩免费精品视频| 色综合导航网站| 欧美成人在线网站| 久久综合久久八八| 国产精品高潮呻吟久久av无限| 色综合老司机第九色激情| 欧美视频在线视频| 欧美高清自拍一区| 性色av一区二区三区在线观看| 日韩av男人的天堂| 久久手机精品视频| 国产精品久久久久久久电影| 亚洲男人天堂2024| 日韩欧美国产中文字幕| 精品国产91久久久久久老师| 精品中文字幕在线观看|