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

資訊專欄INFORMATION COLUMN

了解PHP容器(Container)的實現

warnerwu / 2607人閱讀

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

看 Laravel 源代碼了解 Container

Dependency Injection Containers 的基本功能:

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

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

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

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
     * 把代詞 綁定到容器里,為后續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
     * 創建對象
     */
    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        // 把容器對象$this,放到參數數組第一個元素。為call_user_func_array使用
        array_unshift($parameters, $this);
        
        // 這里$this->binds[$abstract] 綁定的閉包函數, 執行函數參數是$parameters
        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}


// 創建一個容器(后面稱作超級工廠)
$container = new Container;


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

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


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



echo "
";

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31720.html

相關文章

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

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

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

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

    antz 評論0 收藏0
  • 團隊一致性PHP開發環境之Docker

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

    xuxueli 評論0 收藏0
  • 團隊一致性PHP開發環境之Docker

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

    niuxiaowei111 評論0 收藏0
  • 團隊一致性PHP開發環境之Docker

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

    鄒強 評論0 收藏0

發表評論

0條評論

warnerwu

|高級講師

TA的文章

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