日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析laravel门面原理与实现

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析laravel门面原理与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Facade模式

描述:Facade模式要求一個子系統的外部與其內部的通信必須通過一個統一的Facade對象進行。Facade模式提供一個高層次的接口,使得子系統更易于使用。

意義:將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。

實現原理

工作流程圖

業務中需要使用子系統的能力步驟:

1.調用子系統的訪問門面,獲取相關服務;
2.門面從容器中獲取子系統的實例;
3.通過子系統的實例,調用其相關服務。

相關技術點分析:

1.了解facade模式。
2.調用子系統門面中不可訪問的方法,會自動觸發__callstatic
如 \App\Facade\Redis::set(.....);
3.static 靜態延時綁定。參考:PHP后期靜態綁定
4.Closure 匿名函數的運用,只有調用$closure()才開始真正起作用。
5.容器的實現。

代碼實現

目錄結構

\client.php 業務調用客戶端:

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12*/ namespace App; require_once './InitIoc.php'; require_once './Facade.php'; require_once './Facade/Redis.php';use App\Facade\Redis;Redis::set('a','b'); echo PHP_EOL;

\Facade.php 門面類

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:04*/ namespace App;use App\Ioc;class Facade {public static function getFacadeRoot(){$facadeAccessor = static::getFacadeAccessor();$obj = Ioc::resolve($facadeAccessor);return $obj();}/**** @param string $name* @param array $arguments* @return mixed*/public static function __callStatic(string $name, array $arguments){$instance = static::getFacadeRoot();if (! $instance) {throw new RuntimeException('A facade root has not been set.');}return $instance->$name(...$arguments);} }

\Facede\Redis.php 訪問子系統能力的門面

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:07*/ namespace App\Facade; //require_once '../Facade.php';use App\Facade;class Redis extends Facade {public static function getFacadeAccessor():string{return 'redis';} }

\Ioc.php服務容器

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 上午11:22*/ namespace App;class Ioc {public static $instance = [];/*** 注入容器* @param string $name* @param \Closure $closure*/public static function register(string $name,\Closure $reslove){static::$instance[$name]=$reslove;}/*** 返回實例* @param string $name* @return mixed*/public static function resolve(string $name){if(static::$instance[$name] instanceof \Closure){return static::$instance[$name];}else{new $name;}} }

\Subsystem\Redis.php 子系統服務能力類

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 下午12:07*/ namespace App\Subsystem;class Redis {public static function set(){echo "Hello world";} }

\InitIoc.php 將子系統的實例注入到容器

<?php /*** Created by PhpStorm.* User: zhangrenjie* Date: 2019/1/12* Time: 下午1:45*/ namespace App; require_once './Subsystem/Redis.php'; require_once './Ioc.php';use App\Subsystem\Redis; use App\Ioc;//將Redis連接注入容器 Ioc::register('redis',function(){return new Redis(); });

轉載于:https://blog.51cto.com/phpme/2342100

總結

以上是生活随笔為你收集整理的浅析laravel门面原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。