通过注册树(注册器)模式可以将对象实例注册(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其它相关文章!