从百草园到三味书屋 (二)IoC 容器

IOC 容器

laravel核心:IOC容器

作用: 容器使得框架各个组件能很好的在一起工作。

IOC基本用法

在 《从百草园到三味书屋 (一)依赖注入》 中,我们定义了 BillerInterface和BillingNotifierInterface 接口。

//假设我们使用了Stripe来进行支付操作。我们可以将Stripe的支付实现绑定到容器里,就像这样
App::bind('BillerInterface', function()
{
    return new StripeBiller(App::make('BillingNotifierInterface'));
});

//注意在我们处理BillingInterface时,我们额外需要一个BillingNotifierInterface的实现,也就是再来一个bind:
App::bind('BillingNotifierInterface', function()
{
    return new EmailBillingNotifier;//可方便切换账单通知接口的具体实现类
});

//一旦我们使用了容器,切换接口的实现就是一行代码的事儿。
class UserController extends BaseController{
    public function __construct(BillerInterface $biller)
    {
        $this->biller = $biller;
    }
}

//想在应用中只实例化某类一次?没问题,使用singleton方法吧:
App::singleton('BillingNotifierInterface', function()
{
    return new SmsBillingNotifier;
});

Stand Alone Container 容器独立运行

你的项目没有使用Laravel?但你依然可以使用Laravel的IoC容器!只要用Composer安装了illuminate/container包就可以了。

容器的核心:通过php反射类实现(php反射类,可以知道类的一切信息)

Reflect Resolution 反射解决方案

//依靠这个强大的PHP特性, Laravel的IoC容器可以实现很有趣的功能!考虑接下来这个类
class UserController extends BaseController
{
    public function __construct(StripBiller $biller)
    {
        $this->biller = $biller;
    }
}

分析:
注意这个控制器的构造函数暗示着有一个StripBiller类型的参数。使用反射就可以检测到这种类型暗示。当Laravel的容器无法解决一个类型的明显绑定时,容器会试着使用反射来解决。

程序流程类似于这样的:

  1. 已经有一个StripBiller的绑定了么?
  2. 没绑定?那用反射来探测一下StripBiller吧。看看他都需要什么依赖。
  3. 解决StripBiller需要的所有依赖(递归处理)
  4. 使用ReflectionClass->newInstanceArgs()来实例化StripBiller

为何需要绑定接口实例

class UserController extends BaseController
{
    public function __construct(BillerInterface $biller)
    {
        $this->biller = $biller;
    }
}
// 为何需要绑定接口实例
App::bind('BillerInterface','StripBiller');

分析:

  1. 假设我们没有为BillerInterface做任何绑定, 容器该怎么知道要注入什么类呢?

  2. 要知道,interface不能被实例化,因为它只是个约定。如果我们不提供更多信息的话,容器是无法实例化这个依赖的。

  3. 所以,我们需要明确指出哪个类要实现这个接口 App::bind('BillerInterface','StripBiller');

    原文链接:https://my.oschina.net/zgldh?tab=newest&am...

什么是反射?

简易反射链接:博客:PHP 面向对象 (十一)反射类

本作品采用《CC 协议》,转载必须注明作者和本文链接
写的不好,就当是整理下思绪吧。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!