【看完就懂】Laravel 服务容器,IoC,DI 阅读笔记

原文地址:https://learnku.com/articles/19195

<?php
    class Container
    {
        protected $binds;

        protected $instances;

        public function bind($abstract, $concrete)
        {

            // $abstract 方法名称
            // var_dump($abstract);
            // $concrete 对象本体
            // var_dump($concrete);
            //判断是否来自于 Closure(闭包类) 接口 
            if ($concrete instanceof Closure) {
                //是闭包放入 $binds
                $this->binds[$abstract] = $concrete;
            } else {
                //不是闭包放入 $instances
                $this->instances[$abstract] = $concrete;
            }

            if($abstract == 'Computer'){
                // var_dump($abstract);
                // var_dump($concrete);
                // 这里并没有接收到 $module 显然 $module 不是在这里用的
                // var_dump($module);
            }
        }

        public function make($abstract, $parameters = [])
        {
            //这里判断 外部传入的对象是否存在 存在返回 外部传入的对象
            //用于判断是否是之前传入的闭包 不是闭包则返回 之前传入的对象
            if (isset($this->instances[$abstract])) {
                return $this->instances[$abstract];
            }

            //不存在
            //array_unshift 在数组开头插入一个或多个单元
            //将对象$this 插入 $parameters 的头部 作为闭包类的 参一 这里做参数拼接
            array_unshift($parameters, $this);

            // var_dump($parameters);die;
            //调用 闭包方法 $abstract 传入 参数$parameters 
            //主要用于创建闭包 传入的对象
            return call_user_func_array($this->binds[$abstract], $parameters);
        }
    }

    //空类(测试用)
    class icbk{

    }

    //Computer类(测试用)
    class Computer{
        public function __construct($obj)
        {
            var_dump($obj);
        }
    }

    //公用键盘类(测试用)
    class CommonBoard{
        public function __construct($obj)
        {
            var_dump($obj);
        }
    }


    $obj = new icbk;
    $container = new Container;

    $container->bind('Board', function($container){
        return new CommonBoard;
    });

    $container->bind('ikbcBoard',$obj);

    //$container 即 array_unshift($parameters, $this); 这里存入的 
    //$module 后面调用出传入 
    //
    $container->bind('Computer',function($container,$module){
        // var_dump($container);
        // var_dump($module);
        // die;
        // 这里就可以传入 任意需要传入的对象 
        return new Computer($container->make($module));
    });

    //实例化 这里就拿到了一个 之前传入的公用键盘类的 Computer类
    $computer = $container->make('Computer',['Board']);

?>

猜你喜欢

转载自www.cnblogs.com/y734290209/p/10826735.html