<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 容器類 ~~~ <?php class Container { //用于提供實例的回調函數,真正的容器還會裝實例等其他內容.從而實現單列等高級功能 public $binding = []; //綁定接口和生成相應實例的回調函數 public function bind($abstract, $concrete = null, $shared = false) { if (!$concrete instanceof Closure) { //如果提供的參數不是回調函數則產生默認的回調函數 $concrete = $this->getClosure($abstract, $concrete); } $this->binding[$abstract] = compact('concrete', 'shared'); } //默認生成的實例的回調函數 protected function getClosure($abstract, $concrete) { //生成實例的回調函數,$c一般為IOC容器對象,在調用回調生成實例時提供 //即build函數中的$concrete($this) return function ($c) use ($abstract, $concrete) { $method = ($abstract == $concrete) ? 'build' : 'make'; //調用的是容器的build或make方法生成的實例 return $c->$method($concrete); }; } //生成實例對象,首先要解決接口和要實例化類之間的依賴關系 public function make($abstract) { $concrete = $this->getConcrete($abstract); if ($this->isBuildable($concrete, $abstract)) { $object = $this->build($concrete); } else { $object = $this->make($concrete); } return $object; } public function isBuildable($concrete, $abstract) { return $concrete === $abstract || $concrete instanceof Closure; } //獲取綁定的回調函數 protected function getConcrete($abstract) { if (!isset($this->binding[$abstract])) { return $abstract; } return $this->binding[$abstract]['concrete']; } //實例化對象 public function build($concrete) { if($concrete instanceof Closure) { return $concrete($this); } //反射... $reflector = new ReflectionClass($concrete); if(!$reflector->isInstantiable()) { echo $message = "Target [$concrete] is not instantiable"; } //獲取要實例化對象的構造函數 $constructor = $reflector->getConstructor(); //沒有定義構造函數,只有默認的構造函數,說明構造函數參數個數為空 if(is_null($constructor)) { return new $concrete; } //獲取構造函數所需要的所有參數 $dependencies = $constructor->getParameters(); $instances = $this->getDependencies($dependencies); //從給出的數組參數在中實例化對象 return $reflector->newInstanceArgs($instances); } /** * 獲取構建類所需要的所有依賴,級構造函數所需要的參數 , */ protected function getDependencies($paramters) { $dependencies = []; foreach ($paramters as $paramter) { //獲取到參數名稱. $dep = $paramter->getClass(); if(is_null($dep)){ $dependencies = null; }else{ $dependencies[] = $this->resolveClass($paramter); } } return (array)$dependencies; } /** * 實例化 構造函數中所需要的參數. */ protected function resolveClass(ReflectionParameter $parameter) { $name = $parameter->getClass()->name; return $this->make($name); } } ~~~ # 測試類 ~~~ <?php include './Container.php'; interface TrafficTool { public function go(); } class Train implements TrafficTool { public function go() { echo "train...."; } } class Leg implements TrafficTool { public function go() { echo "leg.."; } } class Traveller { /** * @var Leg|null|Train * 旅行工具 */ protected $_trafficTool; public function __construct(TrafficTool$trafficTool) { $this->_trafficTool = $trafficTool; } public function visitTibet() { $this->_trafficTool->go(); } } //實例化IoC容器 $app = new Container(); //綁定某一功能到IoC $app->bind('TrafficTool', 'Train'); $app->bind('travellerA', 'Traveller'); // 實例化對象 $tra = $app->make('travellerA'); $tra->visitTibet(); ~~~ # 源碼解析 在laravel框架中,服務容器是通過 `Illuminate\Container\Container` 類來實現的,其實現原理和上面相同,這里給出容器類的工作圖 服務綁定有時也稱為服務注冊,在全文兩者意義相同,只是對不同上下文環境某種說法更加貼切而已 服務容器工作示意圖 ![](https://box.kancloud.cn/c5ce096b11c288d589fde9c526ab395b_649x237.png) ![](https://box.kancloud.cn/d3eeae9a093cca23a2adfcbe3480011c_334x147.png) 服務容器類中定義了兩個用于管理服務的屬性,分別是`$bindings`和`$instance`,其中`$bindings`用于存儲提供服務的回調函數,而`$instances`用于存儲程序中的共享實例,也可以稱為單例 ![](https://box.kancloud.cn/cd73cb51796bcc33a96de3e7d5685a37_353x74.png) ![](https://box.kancloud.cn/a9b87639573738ad4cdd719444a7709c_769x835.png) 這幾個函數實現了laravel框架的服務容器的服務綁定功能.主要是由bind()函數實現的 singleton()函數實現的是單例綁定,即程序中如果沒有服務名稱對應的實例對象,則通過服務容器實例化一個后進行記錄,如果在后續的程序還需要同名的服務時則返回先前創建的服務實例對象.該函數相當于bind()函數的一個特例,即參數`$shared`值為true的情況 ![](https://box.kancloud.cn/7a7202610995a1dec4385c493b938e30_777x126.png) ![](https://box.kancloud.cn/3f260049805385bf83025177f5baa414_759x37.png) ![](https://box.kancloud.cn/f7f05709fa33dbc502b4bcb120afc438_650x621.png) ![](https://box.kancloud.cn/36988a0df63ce90b8946155bb3289ab0_776x463.png) ![](https://box.kancloud.cn/37493fe6e931fd69566fe99aac83acf9_631x251.png) ![](https://box.kancloud.cn/cc89b0071333e6d477c859c29ab414c6_786x621.png) ![](https://box.kancloud.cn/daf1060c1d8a3b432bc0bcf339703fd6_539x253.png) ![](https://box.kancloud.cn/19986724e324dd8c0c296ff8345ad274_765x920.png) ![](https://box.kancloud.cn/075487d69ae0c187338bfa0fa82ad995_647x202.png) ![](https://box.kancloud.cn/9276bb7190865a8c11a9983a771e0b0e_774x550.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看