简单实现一个laravelapp容器绑定实例

纵观laravelapp容器里面有一些kernel先行注册的服务,所谓的这些服务就是我们php常用的一些类,laravel预加载的一些框架所用到的类。

还有一些就是每次单一绑定实例也就是singleton绑定一个共享实例。

下面我们用自己的方式实现一个app的容器绑定

<?php
class App implements \ArrayAccess{
    private $_bindings = array();//服务列表
    private $_instances = array();//已经实例化的服务


    //获取服务
    public function get($name,$params=array()){
        //先从已经实例化的列表中查找
        if(isset($this->_instances[$name])){
            return $this->_instances[$name];
        }


        //检测有没有注册该服务
        if(!isset($this->_bindings[$name])){
            return null;
        }


        $concrete = $this->_bindings[$name]['class'];//对象具体注册内容


        $obj = null;
        //匿名函数方式
        if($concrete instanceof \Closure){
            $obj = call_user_func_array($concrete,$params);
        }elseif(is_string($concrete)){//字符串方式
            if(empty($params)){
                $obj = new $concrete;
            }else{
                //带参数的类实例化,使用反射
                $class = new \ReflectionClass($concrete);
                $obj = $class->newInstanceArgs($params);
            }
        }


        //如果是共享服务,则写入_instances列表,下次直接取回
        if($this->_bindings[$name]['shared'] == true && $obj){
            $this->_instances[$name] = $obj;
        }


        return $obj;
    }


    //检测是否已经绑定
    public function has($name){
        return isset($this->_bindings[$name]) or isset($this->_instances[$name]);
    }


    //卸载服务
    public function remove($name){
        unset($this->_bindings[$name],$this->_instances[$name]);
    }


    //设置服务
    public function set($name,$class){
        $this->_registerService($name, $class);
    }


    //设置共享服务
    public function setShared($name,$class){
        $this->_registerService($name, $class, true);
    }


    //注册服务
    private function _registerService($name,$class,$shared=false){
        $this->remove($name);
        if(!($class instanceof \Closure) && is_object($class)){
            $this->_instances[$name] = $class;
        }else{
            $this->_bindings[$name] = array("class"=>$class,"shared"=>$shared);
        }
    }


    //检测服务是否存在
    public function offsetExists($offset) {
        return $this->has($offset);
    }


    //获取服务
    public function offsetGet($offset) {
        return $this->get($offset);
    }


    //注册服务,非共享
    public function offsetSet($offset, $value) {
        return $this->set($offset,$value);
    }


    //卸载服务
    public function offsetUnset($offset) {
        return $this->remove($offset);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值