亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 PHP 反射 API 編寫和使用 PHP 依賴注入容器

如何使用 PHP 反射 API 編寫和使用 PHP 依賴注入容器

PHP
慕森王 2021-12-24 15:25:28
我正在嘗試在純 OOP 應用程序中實現一個簡單的 DI。我想使用依賴注入來管理許多服務(數據庫、請求驗證器、緩存等)。我讀過很多博客,喜歡tech-tajawal 的這篇博客,但我真的不明白應該在哪里包含 tech-tajawal 寫的容器。有人可以告訴我怎么做嗎?我想要它干凈,因此想要使用基于構造函數的注入。所以如果我有一個類,讓我們說AbstractBaseController哪個將注入一個名為 的依賴項Request,所以我會寫:php:<?php     namespace src\controllers;     use system\middlewares\Request as Request;     abstract class AbstractBaseController {         private $request;         public function __construct(Request $request) {             $this->request = $request;             return $this;         }     }但這只是拋出致命錯誤:未捕獲的類型錯誤:傳遞給 src\controllers\AbstractBaseController::__construct() 的參數 1 必須是 system\middlewares\Request 的實例,沒有給出`我認為來自 tech-tajawal 的容器必須以某種方式包含在我的項目根目錄中,但我不知道如何。請原諒我的幼稚,因為我總是依賴于框架。
查看完整描述

1 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

你應該在你的應用程序開始的時候實例化你的容器(想想一個引導類,或者甚至在 index.php 本身的頂部,考慮一個非常簡單的應用程序),因為你需要在所有后續操作之前準備好容器服務的實例化。


在容器實例化之前唯一可能執行的其他事情是與配置相關的那些,因為容器正常工作通常需要這些(配置參數、PSR-4 自動加載配置等)。


例如,假設您有一個稱為MyController擴展抽象類的類AbstractBaseController。


然后,例如,在 index.php 上,您可以實例化您的容器和控制器:


//index.php

$container = new Container();

$controller = $container->get('namespace\of\MyController');

$controller->render();

當您這樣做時,來自構造函數的所有依賴項都將由容器庫的自動裝配模塊處理。


在實際應用中,控制器的實例化通常在路由器內部處理,路由器將 URL 地址、方法和參數映射到容器要加載的不同類。


自動裝配的一個經驗法則是,您永遠不能再new namespace\of\MyController()直接調用,因為手動實例化它需要您傳遞每個構造函數依賴項(因此您并沒有真正使用自動裝配功能)。實例化它的正確方法始終是使用$container->get('namespace\of\MyController').


查看完整回答
反對 回復 2021-12-24
  • 1 回答
  • 0 關注
  • 182 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號