亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的di容器

clasnake / 866人閱讀

摘要:下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的容器,很多地方處理并不是很好,但是應(yīng)該已經(jīng)足夠了。這個(gè)變量保存,是名字實(shí)例的映射單例一開始是受到的影響,所以寫了一個(gè)函數(shù),看完的容器實(shí)現(xiàn),印象之中,和來回變換。

之前看了好多框架,laravel,thinkphp,yii等等?;旧隙际褂昧巳萜鳌?duì)于我而言,雖然看懂了laravel是怎么寫的,但是如果自己不去嘗試一下,始終覺得不會(huì)這個(gè)東西。

下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的容器,很多地方處理并不是很好,但是應(yīng)該已經(jīng)足夠了。

實(shí)例的映射
    private $binds = [];


    public static $instance = null;

    /**
     * 單例
     */
    public static function getInstance(){
        if(static::$instance == null){
            static::$instance = new static();
            return static::$instance ;
        }
        return static::$instance;
    }

    /**
     * 一開始是受到laravel的影響,所以寫了一個(gè)bind函數(shù),
     * 看完laravel的容器實(shí)現(xiàn),印象之中,$concrete和$abstract來回變換。
     * 下面的代碼有點(diǎn)像thinkphp的里面的實(shí)現(xiàn),好理解一點(diǎn)
     */
    public static function bind($name,$class = null){
        if($class instanceof Closure){
            static::getInstance()->binds[$name] = $class;
        }else if(is_object($class)){
            static::getInstance()->binds[$name] = $class;
        }else{
            //在這里開始make一個(gè)數(shù)組,laravel好像是make和build分開的。
            static::getInstance()->make($name);
        }
        
    }

    /**
     * 核心是make方法了
     */
    public static function get($name){
        return static::getInstance()->make($name);
    }

    /**
     * 核心make方法
     */
    public function make($name){
        try{
            //根據(jù)類名去查找$this->binds實(shí)例是否已經(jīng)存在,如果存在就直接返回
            if(array_key_exists($name,$this->binds)){
                return $this->binds[$name];
            }
            //根據(jù)類名得到它的反射類
            $reflectClass = new ReflectionClass($name);
            //利用反射類
            $constructor = $reflectClass->getConstructor();
            //如果沒有構(gòu)造器的話,就直接去實(shí)例化它
            $params = [];
            if(!is_null($constructor)){
                //獲取構(gòu)造器中的方法
                $constructorParams = $constructor->getParameters();
                // var_dump($constructorParams);
                //保存構(gòu)造器的參數(shù)
                foreach($constructorParams as $constructorParam){
                    //這個(gè)地方主要是判斷參數(shù)是否是類,如果是就遞歸的構(gòu)造它,不是就簡(jiǎn)單的添加到$this->params中
                    if(!is_null($constructorParam->getType())){
                        $params[] =$this->make($constructorParam->name,$constructorParam->name);
                    }else{
                        $params[] = $constructorParam->name;
                    }
                }
            }
            //在這個(gè)地方構(gòu)造實(shí)例
            $class = $reflectClass->newInstanceArgs($params);
            //綁定
            $this->binds[$name] = $class;
            return $class;
        }catch(ReflectionException $e){
            echo $e->getMessage();
        }
    }

    private function __construct(){}
    private function __clone(){}

}
?>

下面是我的測(cè)試文件了,

name;
    }

    public function sayDI2Name(DI2 $di2){
        //如果這么寫的,di2方法會(huì)先于前面的字符串打印出來
        // echo "form Test say di2 name: ".$di2->sayName();
        echo "form Test say di2 name: ";
        echo $di2->sayName();
    }
}

class DI{
    private $name = "DI";
    public function __construct(DI2 $di2){}
    public function sayName(){
        echo $this->name;
    }    
}

class DI2{
    private $name = "DI2";
    public function __construct(){}
    
    public function sayName(){
        echo $this->name;
    }   
}

class DI3{
    private $name = "DI3";
    public function __construct(){}
    
    public function sayName(){
        echo $this->name;
    }   
}

class DI4{
    private $name = "DI4";
    public function __construct(){}
    
    public function sayName(){
        echo $this->name;
    }   
}

//要不要無所謂了
// Container::bind("test","Test"); 
$test = Container::get("test");
$test->sayName();
echo "
";
$test->sayDI2Name(new DI2());
echo "
";

$di = Container::get("di");
$di->sayName();

echo "
";
$di2 = Container::get("di2");
$di2->sayName();

echo "
";
$di3 = new DI3();
Container::get("di3",$di3)->sayName();
echo "
";
$di4 = function(){
    return new DI4();
};

Container::get("di4",$di4)->sayName();
echo "
";


?>

最后的結(jié)果如下

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30963.html

相關(guān)文章

  • Yii源碼解讀-依賴注入(容器

    摘要:在中使用解耦,有兩種注入方式構(gòu)造函數(shù)注入屬性注入。對(duì)象的實(shí)例化解析依賴信息該方法實(shí)質(zhì)上就是通過的反射機(jī)制,通過類的構(gòu)造函數(shù)的參數(shù)分析他所依賴的單元。 有關(guān)概念 依賴倒置原則(Dependence Inversion Principle, DIP) 傳統(tǒng)軟件設(shè)計(jì)中,上層代碼依賴于下層代碼,當(dāng)下層出現(xiàn)變動(dòng)時(shí),上層也要相應(yīng)變化。 DIP的核心思想是:上層定義接口,下層實(shí)現(xiàn)這個(gè)接口,從而使的下...

    Prasanta 評(píng)論0 收藏0
  • PHP程序員如何理解IoC/DI

    摘要:依賴注入容器管理應(yīng)用程序中的全局對(duì)象包括實(shí)例化處理依賴關(guān)系。為了解決這樣的問題,我們?cè)俅位氐饺肿?cè)表創(chuàng)建組件。參考文章程序員如何理解依賴注入容器補(bǔ)充很多代碼背后,都是某種哲學(xué)思想的體現(xiàn)。 思想 思想是解決問題的根本思想必須轉(zhuǎn)換成習(xí)慣構(gòu)建一套完整的思想體系是開發(fā)能力成熟的標(biāo)志——《簡(jiǎn)單之美》(前言) . 成功的軟件項(xiàng)目就是那些提交產(chǎn)物達(dá)到或超出客戶的預(yù)期的項(xiàng)目,而且開發(fā)過程符合時(shí)間和費(fèi)...

    DataPipeline 評(píng)論0 收藏0
  • 聊一聊PHP依賴注入(DI) 和 控制反轉(zhuǎn)(IoC)

    摘要:前言最近在使用框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入控制反轉(zhuǎn),覺得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入(控制反轉(zhuǎn)),覺得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。 簡(jiǎn)介 I...

    sixgo 評(píng)論0 收藏0
  • 搞懂依賴注入, 用 PHP 手寫簡(jiǎn)易 IOC 容器

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

    antz 評(píng)論0 收藏0
  • Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解

    摘要:對(duì)象之間耦合度過高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象的過程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...

    atinosun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<