国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP通過反射實現(xiàn)自動注入?yún)?shù)

seal_de / 1502人閱讀

摘要:現(xiàn)在的框架中都有一個容器,而容器解決依賴的問題是通過反射來達到的,首先先說明一下項目文件結(jié)構(gòu)核心,獲得實例而我們要運行,而這個控制器的構(gòu)造函數(shù)需要一個類,而類構(gòu)造函數(shù)需要一個類。以上代碼可以查看我的倉庫

現(xiàn)在的框架中都有一個容器, 而容器解決依賴的問題是通過反射來達到的,

首先先說明一下項目文件結(jié)構(gòu):

/ ROOT_PATH

├─src
│ ├─Controllers
│ │  └─IndexController.php
| ├─Application.php (核心,獲得實例)
│ ├─Http.php
│ └─Request.php
│
├─vendor
│ └─autoload.php
│
├─composer.json
└─index.php

而我們要運行IndexController.php,而這個控制器的構(gòu)造函數(shù)需要一個Request類,而Request類構(gòu)造函數(shù)需要一個Http類。


IndexController.php

className;
    }

}

Application.php

isInstantiable())
            {
                throw new Exception($class . " 類不可實例化");
            }

            // 查看是否用構(gòu)造函數(shù)
            $rel_method = $rel_class->getConstructor();

            // 沒有構(gòu)造函數(shù)的話,就可以直接 new 本類型了
            if (is_null($rel_method))
            {
                return new $class();
            }

            // 有構(gòu)造函數(shù)的話就獲取構(gòu)造函數(shù)的參數(shù)
            $dependencies = $rel_method->getParameters();

            // 處理,把傳入的索引數(shù)組變成關(guān)聯(lián)數(shù)組, 鍵為函數(shù)參數(shù)的名字
            foreach ($parameters as $key => $value)
            {
                if (is_numeric($key))
                {
                    // 刪除索引數(shù)組, 只留下關(guān)聯(lián)數(shù)組
                    unset($parameters[$key]);

                    // 用參數(shù)的名字做為鍵
                    $parameters[$dependencies[$key]->name] = $value;
                }
            }

            // 處理依賴關(guān)系
            $actual_parameters = [];

            foreach ($dependencies as $dependenci)
            {
                // 獲取對象名字,如果不是對象返回 null
                $class_name = $dependenci->getClass();
                // 獲取變量的名字
                $var_name = $dependenci->getName();

                // 如果是對象, 則遞歸new
                if (array_key_exists($var_name, $parameters))
                {
                    $actual_parameters[] = $parameters[$var_name];
                }
                elseif (is_null($class_name))
                {
                    // null 則不是對象,看有沒有默認值, 如果沒有就要拋出異常
                    if (! $dependenci->isDefaultValueAvailable())
                    {
                        throw new Exception($var_name . " 參數(shù)沒有默認值");
                    }

                    $actual_parameters[] = $dependenci->getDefaultValue();
                }
                else
                {
                    $actual_parameters[] = self::make($class_name->getName());
                }

            }


            // 獲得構(gòu)造函數(shù)的數(shù)組之后就可以實例化了
            return $rel_class->newInstanceArgs($actual_parameters);
        }

    }

Http.php

className = __CLASS__;
    }
}

Request.php

className = __CLASS__;

        $this->className = $this->className . "  ->  " . $http->className;
    }
}

index.php



輸出:

我是 WaitmoonmanReflexControllersIndexController 我依賴WaitmoonmanReflexRequest -> WaitmoonmanReflexHttp
F:phpStudyWWW
eflexindex.php:12:
object(WaitmoonmanReflexControllersIndexController)[9]

這就是一個完整的反射類動態(tài)注入?yún)?shù)的實例。
以上代碼可以查看我的git倉庫

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25851.html

相關(guān)文章

  • 淺析如何通過PHP類的反射實現(xiàn)依賴注入

    摘要:也正式因為類的反射很多框架才能實現(xiàn)依賴注入自動解決類與類之間的依賴關(guān)系,這給我們平時的開發(fā)帶來了很大的方便。為了更好地理解,我們通過一個例子來看類的反射,以及如何實現(xiàn)依賴注入。反射出方法的參數(shù)其返回值為對象構(gòu)成的數(shù)組。 PHP具有完整的反射 API,提供了對類、接口、函數(shù)、方法和擴展進行逆向工程的能力。通過類的反射提供的能力我們能夠知道類是如何被定義的,它有什么屬性、什么方法、方法都有...

    WilsonLiu95 評論0 收藏0
  • 搞懂依賴注入, 用 PHP 手寫簡易 IOC 容器

    摘要:依賴注入控制反轉(zhuǎn)的一種具體實現(xiàn)方法。接下來,我們使用依賴注入實現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質(zhì)量更高的測試代碼。 前言 好的設(shè)計會提高程序的可復(fù)用性和可維護性,也間接的提高了開發(fā)人員的生產(chǎn)力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...

    antz 評論0 收藏0
  • 反射PHP 中的應(yīng)用

    摘要:反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類方法屬性參數(shù)等的詳細信息,包括注釋。反射是操縱面向?qū)ο蠓缎椭性P偷模捎糜跇?gòu)建復(fù)雜,可擴展的應(yīng)用。 反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細信息,包括注釋。 反射是操縱面向?qū)ο蠓缎椭性P偷?AP...

    stormgens 評論0 收藏0
  • PHP反射機制

    摘要:反射機制反射機制從開始支持,做業(yè)務(wù)開發(fā)的話應(yīng)該很少接觸反射。我的理解就是反射機制能拿到類里面的屬性方法,和的也可以以上是官方文檔中給出的東西,說實話我看了感覺沒什么感覺。在容器成員變量中數(shù)組維護這個類,反射實例調(diào)用構(gòu)造函數(shù),獲取返回值。 PHP反射機制 PHP反射機制從PHP5開始支持,做業(yè)務(wù)開發(fā)的話應(yīng)該很少接觸反射。我其實也是接觸不多,最近在學(xué)習(xí)laravel的優(yōu)雅,就接觸了到它其中...

    URLOS 評論0 收藏0
  • Laravel 服務(wù)容器實現(xiàn)原理

    摘要:框架中就是使用服務(wù)容器來實現(xiàn)控制反轉(zhuǎn)和依賴注入。容器依賴注入的實現(xiàn)實現(xiàn)原理需要了解的知識點閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時創(chuàng)建一個沒有指定名稱的函數(shù)反射以上版本具有完整的反射,添加了對類接口函數(shù)方法和擴展進行反向工程的能力。 前言 通過實現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進思想。 什么是服務(wù)容器 服務(wù)容器是用來管理類依賴與運行依賴注入的工具。La...

    wupengyu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<