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

資訊專欄INFORMATION COLUMN

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

warnerwu / 2694人閱讀

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

看 Laravel 源代碼了解 Container

Dependency Injection Containers 的基本功能:

Container 管理對象實例化到配置的過程

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

這就是為什么 Container 能夠管理任何 PHP 對象。 對象使用 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 {

    // 用于存儲所有綁定 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)建對象
     */
    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        // 把容器對象$this,放到參數(shù)數(shù)組第一個元素。為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)建一個容器(后面稱作超級工廠)
$container = new Container;


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

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


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



echo "
";

// 開始啟動生產(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

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

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

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

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

    antz 評論0 收藏0
  • 團(tuán)隊一致性PHP開發(fā)環(huán)境之Docker

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

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

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

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

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

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

發(fā)表評論

0條評論

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