成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

了解PHP容器(Container)的實(shí)現(xiàn)

warnerwu / 2611人閱讀

摘要:看源代碼了解的基本功能管理對(duì)象實(shí)例化到配置的過程對(duì)象本身不知道自己是由管理的,對(duì)一無所知。對(duì)象使用來管理依賴關(guān)系非常好,但不是必須的。

看 Laravel 源代碼了解 Container

Dependency Injection Containers 的基本功能:

Container 管理對(duì)象實(shí)例化到配置的過程

對(duì)象本身不知道自己是由 Container 管理的,對(duì) Container 一無所知。

這就是為什么 Container 能夠管理任何 PHP 對(duì)象。 對(duì)象使用 DI 來管理依賴關(guān)系非常好,但不是必須的。

i
logger = $logger;
    }

    public function show() {
        $user = "小灰灰";
        $this->logger->execute($user);
    }
}

$useLogger = new UseLogger(new LogToFile());

$useLogger->show();
ii A
logger = $logger;
    }

    public function show() {
        $user = "小灰灰";
        $this->logger->execute($user);
    }
}
$useLogger = new UseLogger(new LogToFile());
 
$useLogger->show();
B
logger = $logger;
    }

    public function show() {
        $user = "小灰灰";
        $this->logger->execute($user);
    }
}
$useLogger = new UseLogger(new LogToDD());
 
$useLogger->show();
iii
logger = $logger;
    }

    public function show() {
        $user = "小灰灰";
        $this->logger->execute($user);
    }
}

$useLogger = new UseLogger(new LogToFile());
 
$useLogger->show();

echo "
"; $useLogger = new UseLogger(new LogToDD()); $useLogger->show();
終極版
logger = $logger;
    }

    public function show() {
        $user = "小灰灰";
        $this->logger->execute($user);
 
    }
}

class SimpleContainer {

    // 用于存儲(chǔ)所有綁定 key-value
    protected static $container = [];

    public static function bind($name, Callable $resolver) {
        static::$container[$name] = $resolver;
    }

    public static function make($name) {
        if(isset(static::$container[$name])){
            $resolver = static::$container[$name] ;
            return $resolver();
        }
        throw new Exception("Binding does not exist in container");
    }
}

SimpleContainer::bind(Logger::class, function () {
    return new LogToDD();
});

$useLogger3 = new UseLogger(SimpleContainer::make(Logger::class));


$useLogger3->show();
示例
module = $module;
    }

    public function show(array $target){

        $this->module->activate($target);
    }
}

class PowerA implements SuperModuleInterface
{
    public function activate(array $target)
    {
        echo "
". __METHOD__;
        print_r(func_get_args());
    }
}

class PowerB implements SuperModuleInterface
{
    public function activate(array $target)
    {
        echo "
". __METHOD__;
        print_r(func_get_args());
    }
}



class Container
{
    protected $binds;

    protected $instances;

    /**
     * @param $abstract
     * @param $concrete
     * 把代詞 綁定到容器里,為后續(xù)make
     */
    public function bind($abstract, $concrete)
    {
        if ($concrete instanceof Closure) {
            $this->binds[$abstract] = $concrete;
        } else {
            $this->instances[$abstract] = $concrete;
        }
    }

    /**
     * @param $abstract
     * @param array $parameters
     * @return mixed
     * 創(chuàng)建對(duì)象
     */
    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        // 把容器對(duì)象$this,放到參數(shù)數(shù)組第一個(gè)元素。為call_user_func_array使用
        array_unshift($parameters, $this);
        
        // 這里$this->binds[$abstract] 綁定的閉包函數(shù), 執(zhí)行函數(shù)參數(shù)是$parameters
        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}


// 創(chuàng)建一個(gè)容器(后面稱作超級(jí)工廠)
$container = new Container;


// 向該 超級(jí)工廠添加超能力模組的生產(chǎn)腳本
$container->bind("powerA", function($container) {
    return new PowerA;
});

// 同上
$container->bind("powerB", function($container) {
    return new PowerB;
});


// 向該 超級(jí)工廠添加超人的生產(chǎn)腳本
$container->bind("superman", function($container, $moduleName) {
    return new Superman($container->make($moduleName));
});



echo "
";

// 開始啟動(dòng)生產(chǎn)
$superman_1 = $container->make("superman", ["powerA"]);
$superman_1->show(["a" => 1]);

$superman_2 = $container->make("superman", ["powerB"]);
$superman_2->show(["b" => 1]);

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

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

相關(guān)文章

  • 從yii2框架中di容器源碼中了解反射作用

    摘要:反射簡(jiǎn)介參考官方簡(jiǎn)介的話,具有完整的反射,添加了對(duì)類接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。此外,反射提供了方法來取出函數(shù)類和方法中的文檔注釋。 反射簡(jiǎn)介 參考官方簡(jiǎn)介的話,PHP 5 具有完整的反射 API,添加了對(duì)類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來取出函數(shù)、類和方法中的文檔注釋。 YII2框架中示例 對(duì)于yii2框架,應(yīng)該都知道di容器,...

    dantezhao 評(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
  • 團(tuán)隊(duì)一致性PHP開發(fā)環(huán)境之Docker

    摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...

    xuxueli 評(píng)論0 收藏0
  • 團(tuán)隊(duì)一致性PHP開發(fā)環(huán)境之Docker

    摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...

    niuxiaowei111 評(píng)論0 收藏0
  • 團(tuán)隊(duì)一致性PHP開發(fā)環(huán)境之Docker

    摘要:環(huán)境模型簡(jiǎn)介是一個(gè)開源的應(yīng)用容器引擎讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。 docker php環(huán)境模型 showImg(https://segmentfault.com/img/bVbfiCy?w=1661&h=871); docker 簡(jiǎn)介 Docker 是一個(gè)開源的應(yīng)用容器引擎 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包...

    鄒強(qiáng) 評(píng)論0 收藏0

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<