容器和依赖注入原理 (易懂)

<?php 
namespace app\index\controller;
 
/**
 * 容器与依赖注入原理:
 * ---------------------------------------------------------------
 * 任何URL访问,最终都会定位到一个控制器,由控制器中具体方法来完成
 * 一个控制器对应着一个类,如果对这些类进行统一管理呢?容器是一个好方案
 * 容器: 除了类管理工具,还可用于将类的实例(实例是啥  对象啊)做为参数,传递给类方法时,触发对象依赖注入进行管理
 * 依赖注入: 将对象类型的数据,以参数的方式传到操作方法中去的技术
 * URL访问: 通过GET可以获取到普通查询变量,如数值,字符串等,但对象无法获取
 * 而控制器或模型类中很多方法是需要依赖外部对象才可以工作,如何操作呢?
 * 依赖注入提供了完美的解决方案:将对象传入到类方法中
 * 使用依赖注入方式接收对象参数主要是控制器类和模型类
 * 类中的构造器和普通方法都可以使用依赖注入导入对象
 * 只要对参数类型进行类型约束,就会自动触发依赖注入行为产生
 * 依赖注入时完成二件事:
 *      1. 自动调用指定类的构造器(如何有)完成类的实例化;
 *      2. 将实例化的对象赋值给类名后指定的变量名称;
 */
 
class Demo1
{
    //【url访问】从URL中接受字符串或数值参数,按参数名称来获取
    public function getName($name='Peter')
    {
        return 'Hello '.$name;
    }
 
    //如果想在当前方法中使用一个对象做为参数,可以使用类型结束来触发依赖注入,生成一个对象
    public function getMethod(\app\common\Temp $temp)
    {
        //依赖注入的等价代码:
        // $temp = new \app\common\Temp;
        //依赖注入时无法给构造器传参数,所以在类中单独创建一个方法来初始化属性
        $temp->setName('筋斗云网络科技');
        return $temp->getName();
    }
 
    //绑定一个类到容器
    public function bindClass()
    {
        //将一个类放到容器中: 相当于注册到容器中
        \think\Container::set('temp','\app\common\Temp');
        //可以使用助手函数bind()简化类名
        // bind('temp','\app\common\Temp');  
 
        //将容器中的类按别名取出并实例化: 实例化同时可执行构造方法给类属性初始化
        $temp = \think\Container::get('temp',['name'=>'Peter_Zhu']);
        // 可以使用助手函数app()简化类名
        // $temp = app('temp',['name'=>'Peter_Zhu']);
 
        return $temp->getName();
    }
 
    //绑定一个闭包(匿名函数)到容器
    public function bindClosure()
    {
        //将一个闭包放到容器中
        \think\Container::set('demo',function($domain){
            return '筋斗云网络科技的域名是:'.$domain;
        });
 
        //将容器中的闭包取出来执行
        return  \think\Container::get('demo',['domain'=>'www.jindouyuns.com']);
    }
}
<?php  
namespace app\common;
//用在容器与依赖注入的案例
class Temp
{
    private $name;
    public function __construct($name='Peter')
    {
        $this->name = $name;
    }
 
    public function setName($name)
    {
        $this->name = $name;
    }
 
    public function getName()
    {
        return '方法是:'.__METHOD__.'属性是:'.$this->name;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值