DIY 實現 ThinkPHP 核心框架 (十四)利用反射實現依賴注入

cn-five發表於2020-09-07

依賴注入由容器自動完成,有了反射機制之後,可以實現自主依賴注入。修改Rrequest 類的構造方法如下

namespace think;

class Request
{
    public function __construct(App $app, $name)
    {
        var_dump($app instanceof App, $name);
    }
}

同時修改 bindParams() 方法,用 getClass() 方法獲取引數型別提示,用 getName() 方法獲取建立例項的類名。

protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array
    {
        // 如果類沒有配置引數,就直接返回空陣列
        if ($reflect->getNumberOfParameters() == 0) {
            return [];
        }
        $args   = [];
        // 獲取引數資訊
        $params = $reflect->getParameters();

        foreach ($params as $param) {
            $name = $param->getName();
            $class = $param->getClass();
            if (isset($vars[$name])) {
                $args[] = $vars[$name];
                // 如果沒有傳參,就採用預設引數
            } elseif ($param->isDefaultValueAvailable()) {
                $args[] = $param->getDefaultValue();
            // 如果獲取到引數型別,進一步實現例項化
            } elseif ($class) {
                $args[] = $this->make($class->getName());
            }
        }

訪問 diy.tp,成功列印出

bool(true) string(4) "five"

表明成功利用反射實現依賴注入,之後刪除 Request 類的建構函式,以便以後的演示。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章