laravel容器(精简版)

容器
<?php
class Container
{
    protected $bindings = [];

    //绑定接口和生成相应实例的回调函数  "traveller", "Traveller"
    public function bind($abstract, $concrete = null, $shared = false) {
        if (! $concrete instanceof Closure) {
            $concrete = function ($c) use ($abstract, $concrete) { //"traveller", "Traveller"
                $method = ($abstract == $concrete) ? 'build' : 'make';
                return $c->$method($concrete);
            };
        }
        $this->bindings[$abstract] = compact('concrete', 'shared');
    }


    //生成实例对象,首先解决接口和要实例化类之间的依赖关系    "traveller"   "Traveller"
    public function make($abstract) {
        if (! isset($this->bindings[$abstract])) {
            return $this->build($abstract);
        } else {
            $concrete = $this->bindings[$abstract]['concrete'];
        }

        if ($concrete instanceof Closure) {
            $object = $this->build($concrete);
        } else {
            $object = $this->make($concrete);
        }
        return $object;
    }


    // 实例化对象
    public function build($concrete) {
        if ($concrete instanceof Closure) {
            return $concrete($this);
        }
        $reflector = new ReflectionClass($concrete);
        if (! $reflector->isInstantiable()) {
            echo $message = "Target [$concrete] is not instantiable.";
        }
        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        $instances = $this->getDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

    //解决通过放射机制实例化对象时的依赖
    protected function getDependencies($parameters) {
        $dependencies = [];
        foreach($parameters as $parameter) {
            $dependency = $parameter->getClass();
            if (is_null($dependency)) {
                $dependencies[] = NULL;
            } else {
                $name = $parameter->getClass()->name;
                $class = $this->make($name);
                $dependencies[] = $class;
            }
        }
        return (array) $dependencies;
    }
}
使用

interface Visit
{
    public function go();
}

class Train implements Visit
{
    public function go() {
        echo "go to Tibet by train!!!";
    }
}

class Traveller{
    protected  $trafficTool;
    public function __construct(Visit $trafficTool)
    {
        $this->trafficTool = $trafficTool;
    }

    public function visitTibet(){
        $this->trafficTool->go();
    }
}

//实例化Ioc容器
$app = new Container();
//完成容器的填充
$app->bind('Visit', 'Train');
$app->bind("traveller", "Traveller");

//通过容器实现依赖注入,完成类的实例化
$tra = $app->make("traveller");
$tra->visitTibet();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值