<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 依賴注入與服務定位器 依賴注入是控制反轉(Inversion of Control,縮寫 IoC)的一種實現方法,是面向對象編程的一種設計原則,通過依賴注入, 可以降低類與類之間的耦合,讓代碼的調試和測試都變得更加簡單。 ## 依賴注入 Blink 通過?`blink\di\Container`?提供 DI 容器功能,它支持構造方法注入、Setter屬性注入和回調注入三種類型的注入方式。 **構造方法注入** 在參數類型提示的幫助下,DI 容器實現了構造方法注入。當容器被用于創建一個新對象時,類型提示會告訴它要依賴什么類或接口。 容器會嘗試獲取它所依賴的類或接口的實例,然后通過構造器將其注入新的對象。例如: ~~~ class Foo { public function __construct(Bar $bar) { } } $foo = $container->get('Foo'); // 上面的代碼等價于: $bar = new Bar; $foo = new Foo($bar); ~~~ **Setter 和屬性注入** Setter 和屬性注入是通過對象配置提供支持的。當注冊一個依賴或創建一個新對象時,你可以提供一個配置,該配置會提供給容器用于通過相應的 Setter 或屬性注入依賴。例如: ~~~ use blink\core\Object; class Foo extends Object { public $bar; private $_qux; public function getQux() { return $this->_qux; } public function setQux(Qux $qux) { $this->_qux = $qux; } } $container->get('Foo', [], [ 'bar' => $container->get('Bar'), 'qux' => $container->get('Qux'), ]); ~~~ **PHP 回調注入** 這種情況下,容器將使用一個注冊過的 PHP 回調創建一個類的新實例。回調負責解決依賴并將其恰當地注入新創建的對象。例如: ~~~ $container->set('Foo', function () { return new Foo(new Bar); }); $foo = $container->get('Foo'); ~~~ ## 服務定位器 服務定位器是一個知道如何提供各種應用所需的服務的對象。在服務定位器中,每個服務都只有一個單獨的實例(服務都是單例的), 并通過 ID 唯一地標識。用這個 ID 就能從服務定位器中得到這個組件。 Blink 中?`blink\core\ServiceLocator`?實現了服務定位器模式,通過服務定位器,我們可以很容易的配置這些服務, 并且每個服務的實現都是可以替換的,只要它們實現的相同的接口。在 Blink 中,整個 application 其實就是一個服務定位器, 它上面掛載了應用所需要的全部服務,諸如errorHandler服務,日志服務、auth服務等等。 要使用服務定位器,第一步是要注冊相關服務。服務可以通過?`blink\core\ServiceLocator::bind()`?方法進行注冊。 以下的方法展示了注冊組件的不同方法: ~~~ use blink\core\ServiceLocator; $locator = new ServiceLocator; // 1\. 通過組件類名 $locator->bind('log', 'blink\log\Logger'); // 2\. 通過配置數組 $locator->bind('log', [ 'class' => 'blink\log\Logger', 'targets' => [], ]); // 3\. 通過匿名函數 $locator->bind('log', function () { return new blink\log\Logger([]); }); // 4\. 直接使用類的實例 $locator->bind('log', new blink\log\Logger()); ~~~ 一旦服務注冊成功,你可以任選以下兩種方式之一,通過它的 ID 訪問它: ~~~ $log = $locator->get('log'); // or $log = $locator->log; ~~~ ## 輔助函數 ** 創建對象 ** Blink 提供了構建與 DI 之上的輔助函數?`make($type, $params = [])`,用于快速創建類的實例并進行依賴注入, 通過 make 函數,可以方便的通過對象配置、類名創建實例,如: ~~~ $object = make([ 'class' => 'blink\log\Logger', 'prop1' => 'prop2', ]); // 和 $object = make('blink\log\Logger'); ~~~ ** 獲取服務實例 ** Blink 提供?`app()`?方法快速獲取服務實例,如下: ~~~ $log = app('log'); // 等價與 $log = app()->get('log'); ~~~
                  <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>

                              哎呀哎呀视频在线观看