PHP注册树模式

又是一场大雪过后,天空像海一样蔚蓝,甚至比海更加晶莹剔透。千峰万岭,极目望去,尽是白色,闪耀着一片连接不断的银光。山顶积雪未融,如白银宫网。

通过注册树(注册器)模式可以将对象实例注册(Register::set())到一棵全局的对象树($objects)上,需要的时候从对象树上采取(Register::get())的设计方法。在工厂模式中实现了类的统一实例化,单例模式中实现了对唯一实例存在就获取不存在就实例化,而注册树模式更像是综合上面的两种方式,对类进行了统一化管理。也避免了类过多实例化的浪费。

注册<?php
 
/**
 * 注册树模式
 * Class Register
 */
class Register
{
    protected static $objects = []; // 保存实例的数据
 
    /**
     * 获取注册树上实例
     * @param string $alias
     * @return object
     */
    public static function get(string $alias): object
    {
        if (isset(self::$objects[$alias])) {
            return self::$objects[$alias];
        }
        throw new ClassNotFoundException('class not exists: ' . $alias);
    }
 
    /**
     * 添加或更新树上的实例
     * @param string $alias
     * @param object $object
     */
    public static function set(string $alias, object $object): void
    {
        self::$objects[$alias] = $object;
    }
 
    /**
     *删除树上的实例
     * @param string $alias
     */
    public static function delete(string $alias): void
    {
        unset( self::$objects[$alias]);
    }
}
 
/*class Tree
{
    public static function test()
    {
        echo 'Register Tree';
    }
}
 
Register::set('a', new Tree());
$object = Register::get('a');
$object::test();*/

注册树模式的应用

thinkPHP6中的注册树模式

/**
 * 容器管理类 支持PSR-11
 */
class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable
{
    /**
     * 容器对象实例
     * @var Container|Closure
     */
    protected static $instance;
 
    /**
     * 容器中的对象实例
     * @var array
     */
    protected $instances = [];
 
    /**
     * 容器绑定标识
     * @var array
     */
    protected $bind = [];
 
    /**
     * 容器回调
     * @var array
     */
    protected $invokeCallback = [];
    
    
    // ...
    
    
    /**
     * 获取容器中的对象实例
     * @access public
     * @param string $abstract 类名或者标识
     * @return object
     */
    public function get($abstract)
    {
        if ($this->has($abstract)) {
            return $this->make($abstract);
        }
    
        throw new ClassNotFoundException('class not exists: ' . $abstract, $abstract);
    }
 
    /**
     * 绑定一个类实例到容器
     * @access public
     * @param string $abstract 类名或者标识
     * @param object $instance 类的实例
     * @return $this
     */
    public function instance(string $abstract, $instance)
    {
        $abstract = $this->getAlias($abstract);
    
        $this->instances[$abstract] = $instance;
    
        return $this;
    }
 
    /**
     * 删除容器中的对象实例
     * @access public
     * @param string $name 类名或者标识
     * @return void
     */
    public function delete($name)
    {
        $name = $this->getAlias($name);
    
        if (isset($this->instances[$name])) {
            unset($this->instances[$name]);
        }
    }
 
 
    // ...
 
 
}

以上就是PHP注册树模式。励志是给人快乐,激励是给人痛苦。更多关于PHP注册树模式请关注haodaima.com其它相关文章!

标签: PHP