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

資訊專欄INFORMATION COLUMN

【譯】深入研究Laravel的依賴注入容器

chavesgu / 1425人閱讀

摘要:原文地址下面是中文翻譯擁有強(qiáng)大的控制反轉(zhuǎn)依賴注入容器。單例在使用自動(dòng)綁定和時(shí),每次需要時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例或者調(diào)用閉包。

原文地址

Laravel"s Dependency Injection Container in Depth


下面是中文翻譯


Laravel擁有強(qiáng)大的控制反轉(zhuǎn)(IoC)/依賴注入(DI) 容器。不幸的是官方文檔并沒(méi)有涵蓋所有可用的功能,因此,我決定嘗試寫(xiě)文檔為自己記錄一下。以下是基于Laravel 5.4.26,其他版本可能有所不同。

依賴注入簡(jiǎn)介

我不會(huì)嘗試在這里解釋DI/IOC背后的原理,如果你不熟悉它們,你可能需要去閱讀由Fabien Potencier(Symfony框架作者)創(chuàng)建的什么是依賴注入

訪問(wèn)容器

在Laravel中有幾種訪問(wèn)Container實(shí)例的方法,但最簡(jiǎn)單的方法是調(diào)用app()helper方法:

$container = app();

我今天不會(huì)描述其他方式,而是我想專注于Container類本身。

注意: 如果你讀了官方文檔,它使用$this->app代替$container

(在Laravel應(yīng)用程序中,它實(shí)際上是Container的一個(gè)子類,稱為Application這就是為什么稱為助手app(),但是這篇文章,我只會(huì)描述Container方法)

在Laravel外使用 IlluminateContainer

要在Laravel外使用Container,請(qǐng)安裝它

然后:

use IlluminateContainerContainer;

$container = Container::getInstance();
基本用法

最簡(jiǎn)單的用法是用你想注入的類鍵入你的類的構(gòu)造函數(shù):

class MyClass
{
    private $dependency;

    public function __construct(AnotherClass $dependency)
    {
        $this->dependency = $dependency;
    }
}

然后new MyClass使用容器的make()方法。

$instance = $container->make(MyClass::class);

容器會(huì)自動(dòng)實(shí)例化依賴關(guān)系,所以這在功能上等同于:

$instance = new MyClass(new AnotherClass());

(除了AnotherClass他自己的一些依賴關(guān)系,在這種情況下Container將遞歸實(shí)例化它們,直到?jīng)]有更多)

實(shí)例

以下是一個(gè)基于PHP-DI docs的更實(shí)用的示例,將郵件功能與用戶注冊(cè)分離:

class Mailer
{
    public function mail($recipient, $content)
    {
        // Send an email to the recipient
        // ...
    }
}
class UserManager
{
    private $mailer;

    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function register($email, $password)
    {
        // Create the user account
        // ...

        // Send the user an email to say hello!
        $this->mailer->mail($email, "Hello and welcome!");
    }
}
use IlluminateContainerContainer;

$container = Container::getInstance();

$userManager = $container->make(UserManager::class);
$userManager->register("dave@davejamesmiller.com", "MySuperSecurePassword!");
將接口(Interfaces)綁定到實(shí)現(xiàn)(Implementations)

Container可以很容易的編寫(xiě)一個(gè)接口,然后在運(yùn)行時(shí)實(shí)例化一個(gè)具體的實(shí)現(xiàn),首先定義接口:

interface MyInterface { /* ... */ }
interface AnotherInterface { /* ... */ }

并聲明實(shí)現(xiàn)這些接口的具體類,他們可能依賴于其他接口(或以前的具體類)

class MyClass implements MyInterface
{
    private $dependency;

    public function __construct(AnotherInterface $dependency)
    {
        $this->dependency = $dependency;
    }
}

然后使用bind()去將每個(gè)接口映射到具體的類

$container->bind(MyInterface::class, MyClass::class);
$container->bind(AnotherInterface::class, AnotherClass::class);

最后通過(guò)將接口名代替類名去傳遞給make()

$instance = $container->make(MyInterface::class);

注意: 如果你忘記去綁定一個(gè)接口,你將會(huì)得到一個(gè)稍微神秘的致命錯(cuò)誤:

Fatal error: Uncaught ReflectionException: Class MyInterface does not exist

這是因?yàn)槿萜鲿?huì)嘗試實(shí)例化interface (new MyInterface),而這不是一個(gè)有效的類。

實(shí)例

下面是一個(gè)實(shí)用的例子,一個(gè)可交換的緩存層

interface Cache
{
    public function get($key);
    public function put($key, $value);
}
class RedisCache implements Cache
{
    public function get($key) { /* ... */ }
    public function put($key, $value) { /* ... */ }
}
class Worker
{
    private $cache;

    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }

    public function result()
    {
        // Use the cache for something...
        $result = $this->cache->get("worker");

        if ($result === null) {
            $result = do_something_slow();

            $this->cache->put("worker", $result);
        }

        return $result;
    }
}
use IlluminateContainerContainer;

$container = Container::getInstance();
$container->bind(Cache::class, RedisCache::class);

$result = $container->make(Worker::class)->result();
綁定抽象類和具體類(Abstract & Concrete Classes)

Binding 也可以使用到 abstract 類:

$container->bind(MyAbstract::class, MyConcreteClass::class);

或者用一個(gè)子類替換一個(gè)具體的類:

$container->bind(MySQLDatabase::class, CustomMySQLDatabase::class);
自定義綁定

如果該類需要額外的配置,你可以傳遞一個(gè)閉包來(lái)代替類名作為bind()的第二個(gè)參數(shù):

$container->bind(Database::class, function (Container $container) {
    return new MySQLDatabase(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS);
});

每次需要數(shù)據(jù)庫(kù)接口時(shí),都會(huì)創(chuàng)建并使用一個(gè)新的MySQLDatabase實(shí)例,并使用指定的配置值。(要想共享單個(gè)實(shí)例,請(qǐng)參考下面的單例)閉包接收Container實(shí)例作為第一個(gè)參數(shù),并且可以在需要時(shí)用于實(shí)例化其他類:

$container->bind(Logger::class, function (Container $container) {
    $filesystem = $container->make(Filesystem::class);

    return new FileLogger($filesystem, "logs/error.log");
});

閉包也可以用來(lái)定制具體類如何實(shí)例化

$container->bind(GitHubClient::class, function (Container $container) {
    $client = new GitHubClient;
    $client->setEnterpriseUrl(GITHUB_HOST);
    return $client;
});
解決回調(diào)

你可以使用resolving()去注冊(cè)一個(gè)用于綁定完成后的回調(diào)函數(shù):

$container->resolving(GitHubClient::class, function ($client, Container $container) {
    $client->setEnterpriseUrl(GITHUB_HOST);
});

如果有多個(gè)回調(diào),它們將全部被調(diào)用,它們也為接口和抽象類工作

$container->resolving(Logger::class, function (Logger $logger) {
    $logger->setLevel("debug");
});

$container->resolving(FileLogger::class, function (FileLogger $logger) {
    $logger->setFilename("logs/debug.log");
});

$container->bind(Logger::class, FileLogger::class);

$logger = $container->make(Logger::class);

也可以通過(guò)添加一個(gè)回調(diào)來(lái)處理無(wú)論是哪個(gè)類被解析,總是調(diào)用該回調(diào)函數(shù)。但是我認(rèn)為他可能只能在日志/調(diào)試中使用:

$container->resolving(function ($object, Container $container) {
    // ...
});
擴(kuò)展一個(gè)類

或者你可以使用extend()包裝類并返回一個(gè)不同的對(duì)象:

$container->extend(APIClient::class, function ($client, Container $container) {
    return new APIClientDecorator($client);
});

結(jié)果對(duì)象仍然應(yīng)該實(shí)現(xiàn)相同的接口,否則使用類型提示會(huì)出錯(cuò)。

單例(Singletons)

在使用自動(dòng)綁定和bind()時(shí),每次需要時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例(或者調(diào)用閉包)。想要共享一個(gè)實(shí)例,使用singleton() 代替 bind()

$container->singleton(Cache::class, RedisCache::class);

或者使用一個(gè)閉包:

$container->singleton(Database::class, function (Container $container) {
    return new MySQLDatabase("localhost", "testdb", "user", "pass");
});

要讓一個(gè)具體的類成為實(shí)例,請(qǐng)傳遞該類且不需要傳遞第二個(gè)參數(shù):

$container->singleton(MySQLDatabase::class);

在不同情況下,單例對(duì)象將在第一次需要時(shí)創(chuàng)建,然后在隨后每次需要時(shí)重用。如果你已經(jīng)有一個(gè)實(shí)例,你想重用使用instance()方法代替。例如,Laravel使用它來(lái)確保無(wú)論什么時(shí)候?qū)螌?shí)例Container實(shí)例注入到類中都會(huì)返回它:

$container->instance(Container::class, $container);
任意綁定名稱

你可以使用任意字符串而不是使用一個(gè)類/接口名稱,盡管你不能使用類型提示檢索它,但必須使用make()代替:

$container->bind("database", MySQLDatabase::class);

$db = $container->make("database");

要同時(shí)支持類/接口,請(qǐng)使用alias()

$container->singleton(Cache::class, RedisCache::class);
$container->alias(Cache::class, "cache");

$cache1 = $container->make(Cache::class);
$cache2 = $container->make("cache");

assert($cache1 === $cache2);
存儲(chǔ)任意值

你也可以使用容器來(lái)存儲(chǔ)任意值,例如配置數(shù)據(jù):

$container->instance("database.name", "testdb");

$db_name = $container->make("database.name");

它支持?jǐn)?shù)組語(yǔ)法訪問(wèn),這使得他更自然:

$container["database.name"] = "testdb";

$db_name = $container["database.name"];

當(dāng)與閉包函數(shù)結(jié)合使用時(shí),你可以看到為什么這是有用的:

$container->singleton("database", function (Container $container) {
    return new MySQLDatabase(
        $container["database.host"],
        $container["database.name"],
        $container["database.user"],
        $container["database.pass"]
    );
});

(Laravel本是不使用容器進(jìn)行配置,它使用一個(gè)多帶帶的Config類來(lái)代替,但是也是通過(guò)PHP-DI實(shí)現(xiàn)的)

Tip: 在實(shí)例化對(duì)象的時(shí)候,也可以使用數(shù)組語(yǔ)法代替make():

$db = $container["database"];
函數(shù)和方法(Functions & Methods)的依賴注入

到現(xiàn)在為止,我們已經(jīng)看到了構(gòu)造函數(shù)的依賴注入(DI),但是Laravel還支持任意函數(shù)的依賴注入(DI):

function do_something(Cache $cache) { /* ... */ }

$result = $container->call("do_something");

其他參數(shù)可以作為索引或關(guān)聯(lián)數(shù)組傳遞:

function show_product(Cache $cache, $id, $tab = "details") { /* ... */ }

// show_product($cache, 1)
$container->call("show_product", [1]);
$container->call("show_product", ["id" => 1]);

// show_product($cache, 1, "spec")
$container->call("show_product", [1, "spec"]);
$container->call("show_product", ["id" => 1, "tab" => "spec"]);

這可以用于任意可調(diào)用的方法:

閉包
$closure = function (Cache $cache) { /* ... */ };

$container->call($closure);
靜態(tài)方法
class SomeClass
{
    public static function staticMethod(Cache $cache) { /* ... */ }
}
$container->call(["SomeClass", "staticMethod"]);
// or:
$container->call("SomeClass::staticMethod");
實(shí)例方法
class PostController
{
    public function index(Cache $cache) { /* ... */ }
    public function show(Cache $cache, $id) { /* ... */ }
}
$controller = $container->make(PostController::class);

$container->call([$controller, "index"]);
$container->call([$controller, "show"], ["id" => 1]);
調(diào)用實(shí)例方法的快捷方式

有一個(gè)快捷方式來(lái)實(shí)例化一個(gè)類并一次調(diào)用一個(gè)方法,使用ClassName@methodName

$container->call("PostController@index");
$container->call("PostController@show", ["id" => 4]);

該容器用于實(shí)例化類,即:

依賴項(xiàng)注入到構(gòu)造函數(shù)(以及方法)中。

如果你希望重用它,你可以將該類定義為單例。

你可以使用接口或任意名稱而不是具體類。

例如:

class PostController
{
    public function __construct(Request $request) { /* ... */ }
    public function index(Cache $cache) { /* ... */ }
}
$container->singleton("post", PostController::class);
$container->call("post@index");

最后,你可以傳遞一個(gè)“默認(rèn)方法”作為第三個(gè)參數(shù),如果第一個(gè)參數(shù)是沒(méi)有指定方法的類名,則會(huì)調(diào)用默認(rèn)方法,Laravel使用它來(lái)實(shí)現(xiàn)事件處理

$container->call(MyEventHandler::class, $parameters, "handle");

// Equivalent to:
$container->call("MyEventHandler@handle", $parameters);
方法調(diào)用綁定

bindMethod()方法可以用于重寫(xiě)方法調(diào)用,例如傳遞其他參數(shù):

$container->bindMethod("PostController@index", function ($controller, $container) {
    $posts = get_posts(...);

    return $controller->index($posts);
});

所有這些都可以通過(guò)使用閉包代替原始方法進(jìn)行工作:

$container->call("PostController@index");
$container->call("PostController", [], "index");
$container->call([new PostController, "index"]);

但是,任何多余傳遞給call()的參數(shù)都不會(huì)傳遞到閉包中,因此無(wú)法使用他們。

$container->call("PostController@index", ["Not used :-("]);

_Notes: 該方法不是 Container interface的一部分, 只適用于具體的 Container 類。為什么忽略參數(shù),請(qǐng)參閱PR

上下文綁定

有時(shí)候你想在不同的地方使用不同的接口實(shí)現(xiàn),下面是Laravel 文檔中的一個(gè)例子:

$container
    ->when(PhotoController::class)
    ->needs(Filesystem::class)
    ->give(LocalFilesystem::class);

$container
    ->when(VideoController::class)
    ->needs(Filesystem::class)
    ->give(S3Filesystem::class);

現(xiàn)在,PhotoController和VideoController都可以依賴文件系統(tǒng)接口,但是每個(gè)接口都會(huì)接受到不同的實(shí)現(xiàn),你也可以像使用bind()一樣使用閉包give()

$container
    ->when(VideoController::class)
    ->needs(Filesystem::class)
    ->give(function () {
        return Storage::disk("s3");
    });

或者一個(gè)命名的依賴關(guān)系:

$container->instance("s3", $s3Filesystem);

$container
    ->when(VideoController::class)
    ->needs(Filesystem::class)
    ->give("s3");
將參數(shù)綁定到原函數(shù)

你也可以通過(guò)傳遞變量名稱給needs()(而不是接口)和傳遞變量給give()來(lái)綁定原函數(shù)

$container
    ->when(MySQLDatabase::class)
    ->needs("$username")
    ->give(DB_USER);

你可以使用閉包來(lái)延遲檢索值直到需要用到它:

$container
    ->when(MySQLDatabase::class)
    ->needs("$username")
    ->give(function () {
        return config("database.user");
    });

在這里,你不能傳遞一個(gè)類或者一個(gè)命名依賴(例如give("database.user")),因?yàn)樗鼤?huì)作為一個(gè)字面值返回,要做到這一點(diǎn),你將不得不使用閉包:

$container
    ->when(MySQLDatabase::class)
    ->needs("$username")
    ->give(function (Container $container) {
        return $container["database.user"];
    });
做標(biāo)記

你可以使用容器去“標(biāo)記”相關(guān)的綁定:

$container->tag(MyPlugin::class, "plugin");
$container->tag(AnotherPlugin::class, "plugin");

然后以數(shù)組方式檢索所有標(biāo)記的實(shí)例:

foreach ($container->tagged("plugin") as $plugin) {
    $plugin->init();
}

tag()的兩個(gè)參數(shù)也可以傳遞數(shù)組:

$container->tag([MyPlugin::class, AnotherPlugin::class], "plugin");
$container->tag(MyPlugin::class, ["plugin", "plugin.admin"]);
重新綁定

_Note: 這個(gè)更高級(jí)一點(diǎn),但是很少用到,可以跳過(guò)它

打工綁定或者實(shí)例已經(jīng)被使用后,rebinding()調(diào)用一個(gè)回調(diào)函數(shù)。例如,這里的session類在被Auth類使用后被替換,所以Auth需要被告知更改:

$container->singleton(Auth::class, function (Container $container) {
    $auth = new Auth;
    $auth->setSession($container->make(Session::class));

    $container->rebinding(Session::class, function ($container, $session) use ($auth) {
        $auth->setSession($session);
    });

    return $auth;
});

$container->instance(Session::class, new Session(["username" => "dave"]));
$auth = $container->make(Auth::class);
echo $auth->username(); // dave
$container->instance(Session::class, new Session(["username" => "danny"]));

echo $auth->username(); // danny

(有關(guān)重新綁定的更多信息,請(qǐng)查看 這里 和 這里.)

刷新

還有一種更便捷的方法來(lái)處理這種模式,通過(guò)refresh()

$container->singleton(Auth::class, function (Container $container) {
    $auth = new Auth;
    $auth->setSession($container->make(Session::class));

    $container->refresh(Session::class, $auth, "setSession");

    return $auth;
});

它也返回現(xiàn)有的實(shí)例或綁定(如果有的話),所以你可以這樣做:

// This only works if you call singleton() or bind() on the class
$container->singleton(Session::class);

$container->singleton(Auth::class, function (Container $container) {
    $auth = new Auth;
    $auth->setSession($container->refresh(Session::class, $auth, "setSession"));
    return $auth;
});

(我個(gè)人覺(jué)得這個(gè)語(yǔ)法更令人困惑,并且更喜歡上面的更詳細(xì)的版本)

Note: 這些方法不是 Container interface的一部分, 只是具體的Container class.

重寫(xiě)構(gòu)造函數(shù)參數(shù)

makeWith()方法允許您將其他參數(shù)傳遞給構(gòu)造函數(shù),她忽略了任何現(xiàn)有的實(shí)例或單例,并且可以用于創(chuàng)建具有不同參數(shù)的類的多個(gè)實(shí)例,同時(shí)依然注入依賴關(guān)系:

class Post
{
    public function __construct(Database $db, int $id) { /* ... */ }
}
$post1 = $container->makeWith(Post::class, ["id" => 1]);
$post2 = $container->makeWith(Post::class, ["id" => 2]);

Note: 在 Laravel 5.3 以及以下版本中,它很簡(jiǎn)單 make($class, $parameters), 但在 Laravel 5.4中被刪除, 但在5.4.16 被重新添加為 makeWith() 。 在Laravel 5.5 可能會(huì) 恢復(fù)到Laravel 5.3 語(yǔ)法.

其他方法

這里涵蓋了我認(rèn)為有用的所有方法,但只是為了整理一些內(nèi)容。下面這些是對(duì)其余共用方法的總結(jié):

bound()

如果類或名稱使用bind(), singleton(), instance()alias()綁定,bound()將會(huì)返回true

if (! $container->bound("database.user")) {
    // ...
}

你還可以使用數(shù)組語(yǔ)法和isset()訪問(wèn):

if (! isset($container["database.user"])) {
    // ...
}

它可以使用unset()重置、刪除指定的綁定/實(shí)例/別名

unset($container["database.user"]);
var_dump($container->bound("database.user")); // false
bindIf()

bindIf()bind()相同,除了他只在不存在綁定的情況下才回注冊(cè)綁定(請(qǐng)參見(jiàn)上面的bound()),它可以用于在包注冊(cè)中默認(rèn)綁定,同事允許用戶覆蓋它:

$container->bindIf(Loader::class, FallbackLoader::class);

沒(méi)有singletonIf()方法,但是你可以使用bindIf($abstract, $concrete, true)實(shí)現(xiàn)它:

$container->bindIf(Loader::class, FallbackLoader::class, true);

或者全部寫(xiě)出來(lái):

if (! $container->bound(Loader::class)) {
    $container->singleton(Loader::class, FallbackLoader::class);
}
resolved()

如果一個(gè)類已經(jīng)被解析,resolved()方法返回true

var_dump($container->resolved(Database::class)); // false
$container->make(Database::class);
var_dump($container->resolved(Database::class)); // true

我不確定他有什么用處,如果使用unset()它會(huì)被重置(請(qǐng)看上面的bound()

unset($container[Database::class]);
var_dump($container->resolved(Database::class)); // false
factory()

factory()方法返回一個(gè)不帶參數(shù)和調(diào)用的閉包make()

$dbFactory = $container->factory(Database::class);

$db = $dbFactory();

我不確定他有什么用處

wrap()

wrap()方法封裝了一個(gè)閉包,以便在其執(zhí)行時(shí)注冊(cè)他的依賴關(guān)系,wrap方法接收一個(gè)數(shù)組參數(shù),返回的閉包不帶參數(shù):

$cacheGetter = function (Cache $cache, $key) {
    return $cache->get($key);
};

$usernameGetter = $container->wrap($cacheGetter, ["username"]);

$username = $usernameGetter();

我不確定他有什么用處,因?yàn)殚]包不需要參數(shù)

Note: 此方法不是Container interface的一部分, 只是具體的 Container class.

afterResolving()

afterResolving()方法的作用和resolving()類似,不同的點(diǎn)是在resolving()回調(diào)后調(diào)用afterResolving。我不確定何時(shí)會(huì)用到。。。

最后

isShared() - 確定給定類型是否是共享單例/實(shí)例

isAlias() - 確定給定的字符串是否是已注冊(cè)的別名

hasMethodBinding() - 確定容器是否具有給定的方法綁定

getBindings() - 檢索所有注冊(cè)綁定的原始數(shù)組

getAlias($abstract) - 解析底層類/綁定名稱的別名

forgetInstance($abstract) - 清除單個(gè)實(shí)例對(duì)象

forgetInstances() - 清除所有實(shí)例對(duì)象

flush() - 清除所有綁定和實(shí)例,有效的重置容器

setInstance() - 使用getInstance()替換使用的實(shí)例

_Note: 最后一節(jié)的方法都不是 Container interface.的一部分


本文最初發(fā)布于2017年6月15日的DaveJamesMiller.com

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/28305.html

相關(guān)文章

  • 深入剖析 Laravel 服務(wù)容器

    摘要:劃下重點(diǎn),服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實(shí)例化及其依賴的注入,完全由服務(wù)容器自動(dòng)的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請(qǐng)注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請(qǐng)求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...

    abson 評(píng)論0 收藏0
  • 深入理解控制反轉(zhuǎn)(IoC)和依賴注入(DI)

    摘要:本文一大半內(nèi)容都是通過(guò)舉例來(lái)讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過(guò)理解這些概念,來(lái)更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見(jiàn)的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...

    HollisChuang 評(píng)論0 收藏0
  • Laravel深入學(xué)習(xí)2 - 控制反轉(zhuǎn)容器

    摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實(shí)現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨(dú)立使用即使沒(méi)有使用框架,我們?nèi)匀豢梢栽陧?xiàng)目中使用安裝組件來(lái)使用的控制反轉(zhuǎn)容器。在沒(méi)有給定任何信息的情況下,容器是無(wú)法實(shí)例化相關(guān)依賴的。 聲明:本文并非博主原創(chuàng),而是來(lái)自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味...

    worldligang 評(píng)論0 收藏0
  • php實(shí)現(xiàn)依賴注入(DI)和控制反轉(zhuǎn)(IOC)

    摘要:工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。其實(shí)我們稍微改造一下這個(gè)類,你就明白,工廠類的真正意義和價(jià)值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉(zhuǎn)載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉(zhuǎn)載務(wù)必保...

    tomato 評(píng)論0 收藏0
  • Laravel深入學(xué)習(xí)1 - 依賴注入

    摘要:然而,我們需要注意的是僅是軟件設(shè)計(jì)模式依賴注入的一種便利的實(shí)現(xiàn)形式。容器本身不是依賴注入的必要條件,在框架他只是讓其變得更加簡(jiǎn)便。首先,讓我們探索下為什么依賴注入是有益的。繼續(xù)深入讓我們通過(guò)另一個(gè)示例來(lái)加深對(duì)依賴注入的理解。 聲明:本文并非博主原創(chuàng),而是來(lái)自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證9...

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

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

0條評(píng)論

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