php注册树模式
作者:勇康博客网 | 分类:PHP | 浏览:1260 | 日期:2021年08月05日一、注册树模式
通过注册树(注册器)模式可以将对象实例注册(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();*/
二、注册树模式的应用
tp6容器中的注册树模式
/** * 容器管理类 支持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]); } } // ... }