TP5源码分析前置知识-注册树模式

一、白话解释一下

所谓注册树也就是在一棵树上种上果子(对象),吃的时候直接在树上去摘,是不是很方便了

在这里插入图片描述

二、看看代码吧
class Register
{
    public static  $obj = [];

    public static function set($type,$obj)
    {
        self::$obj[$type] = $obj;
    }
    public static  function get($type)
    {
        return  self::$obj[$type];
    }

    public static function _unset($type){
        unset(self::$obj[$type]);
    }
}

class A{

}

class B{
}

Register::set('A',new A);
Register::set('B',new B);
var_dump(Register::get('A'));
三、TP5中的容器

class Container 
{
    protected static $instance; //容器对象实例

    protected $instances = [];//容器中的对象实例

    protected $name = [];//容器标识别名

    public static function getInstance()//获取当前容器的实例(单例)
    {
        if (is_null(static::$instance)) {
            static::$instance = new static;
        }
        return static::$instance;
    }
    
    public static function setInstance($instance)//设置当前容器的实例
    {
        static::$instance = $instance;
    }

    /**
     * 获取容器中的对象实例
     * @access public
     * @param  string        $abstract       类名或者标识
     * @param  array|true    $vars           变量
     * @param  bool          $newInstance    是否每次创建新的实例
     * @return object
     */
    public static function get($abstract, $vars = [], $newInstance = false)
    {
        return static::getInstance()->make($abstract, $vars, $newInstance);
    }

    /**
     * 绑定一个类、闭包、实例、接口实现到容器
     * @access public
     * @param  string  $abstract    类标识、接口
     * @param  mixed   $concrete    要绑定的类、闭包或者实例
     * @return Container
     */
    public static function set($abstract, $concrete = null)
    {
        return static::getInstance()->bindTo($abstract, $concrete);
    }
 /**
     * 绑定一个类、闭包、实例、接口实现到容器
     * @access public
     * @param  string|array  $abstract    类标识、接口
     * @param  mixed         $concrete    要绑定的类、闭包或者实例
     * @return $this
     */
    public function bindTo($abstract, $concrete = null)
    {
        if (is_array($abstract)) {
            $this->bind = array_merge($this->bind, $abstract);
        } elseif ($concrete instanceof Closure) {
            $this->bind[$abstract] = $concrete;
        } elseif (is_object($concrete)) {
            if (isset($this->bind[$abstract])) {
                $abstract = $this->bind[$abstract];
            }
            $this->instances[$abstract] = $concrete;
        } else {
            $this->bind[$abstract] = $concrete;
        }
        return $this;
    }

}

四、叨叨一下

所述完全根据自己的理解白话化,肯定有欠妥之处,欢迎来人朋友指正。

猜你喜欢

转载自blog.csdn.net/weixin_38048544/article/details/106875160
今日推荐