企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# (\*)注册树(注射器、注册表)模式 `注册树模式`又称`注册模式`或`注册器模式`。 注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法 注册上去后可以无限采摘 创建好这个对象如何直接获得这个对象呢就用注册模式 ``` <pre class="calibre10">``` class <span class="token4">Registry</span><span class="token3">{</span> static private $_store<span class="token1">=</span><span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">/** * 将对象注册到$_store上 * @param object $obj 类的实例化对象 * @param string|null $name 该对象的实际类名 */</span> static public <span class="token5">function</span> <span class="token4">set</span><span class="token3">(</span>$obj<span class="token3">,</span>$name<span class="token1">=</span><span class="token5">null</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">is_object</span><span class="token3">(</span>$obj<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4">Exception</span><span class="token3">(</span><span class="token2">"参数不是期望的类对象"</span><span class="token3">,</span> <span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> $name<span class="token1">=</span><span class="token3">(</span><span class="token1">!</span><span class="token4">is_null</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">)</span><span class="token1">?</span><span class="token3">:</span><span class="token4">get_class</span><span class="token3">(</span>$obj<span class="token3">)</span><span class="token3">;</span> $name<span class="token1">=</span><span class="token4">strtolower</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">;</span> $<span class="token5">return</span><span class="token1">=</span><span class="token5">null</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $<span class="token5">return</span> <span class="token1">=</span> self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token1">=</span>$obj<span class="token3">;</span> <span class="token5">return</span> $<span class="token5">return</span><span class="token3">;</span> <span class="token3">}</span> static public <span class="token5">function</span> <span class="token4">get</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">{</span> $name<span class="token1">=</span><span class="token4">strtolower</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span>self<span class="token3">:</span><span class="token3">:</span><span class="token4">isContains</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4">Exception</span><span class="token3">(</span><span class="token2">"该类的实例对象不存在"</span><span class="token3">,</span> <span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> static public <span class="token5">function</span> <span class="token4">remove</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">{</span> $name<span class="token1">=</span><span class="token4">strtolower</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span><span class="token4">isContains</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">unset</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">/** * 检查给定的类的类对象是否挂载到注册树($_store)上 * @param [type] $name [description] * @return boolean [description] */</span> static public <span class="token5">function</span> <span class="token4">isContains</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">{</span> $name<span class="token1">=</span><span class="token4">strtolower</span><span class="token3">(</span>$name<span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">isset</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$_store<span class="token3">[</span>$name<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token6">false</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> <span class="token6">true</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">Fruit</span><span class="token3">{</span><span class="token3">}</span> $std<span class="token1">=</span><span class="token5">new</span> <span class="token4">stdClass</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> Registry<span class="token3">:</span><span class="token3">:</span><span class="token4">set</span><span class="token3">(</span>$std<span class="token3">)</span><span class="token3">;</span> $fruit<span class="token1">=</span><span class="token5">new</span> <span class="token4">Fruit</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> Registry<span class="token3">:</span><span class="token3">:</span><span class="token4">set</span><span class="token3">(</span>$fruit<span class="token3">)</span><span class="token3">;</span> $std<span class="token1">=</span>Registry<span class="token3">:</span><span class="token3">:</span><span class="token4">get</span><span class="token3">(</span><span class="token2">"stdClass"</span><span class="token3">)</span><span class="token3">;</span> $fruit<span class="token1">=</span>Registry<span class="token3">:</span><span class="token3">:</span><span class="token4">get</span><span class="token3">(</span><span class="token2">"Fruit"</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$std<span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$fruit<span class="token3">)</span><span class="token3">;</span> ``` ``` 例子2:与工厂模式结合 ``` <pre class="calibre17">``` <span class="token1"><</span><span class="token1">?</span>php 前面的工厂加单例模式用到的话还是需要调用工厂或者。。定义好后如何取到这个类呢一般就要用到注册模式 用来将一些对象注册到全局树上面 就可以在任何地方访问 还可以给对象取别名; 工厂模式和注册模式配合使用,放到程序初始化里面 Register<span class="token3">.</span>php: namespace IMooc<span class="token3">;</span> class <span class="token4">Register</span><span class="token3">{</span> protected static $objects<span class="token3">;</span> <span class="token">//第一个参数是第二个参数(对象)的映射的名(将对象放到树上)</span> static <span class="token5">function</span> <span class="token4">set</span><span class="token3">(</span>$alias<span class="token3">,</span>$object<span class="token3">)</span><span class="token3">{</span> self<span class="token3">:</span><span class="token3">:</span>$objects<span class="token3">[</span>$alias<span class="token3">]</span> <span class="token1">=</span> $object<span class="token3">;</span> <span class="token3">}</span> <span class="token">//unset是php的关键字所以前面加了个_</span> <span class="token5">function</span> <span class="token4">_unset</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> self<span class="token3">:</span><span class="token3">:</span>$objects<span class="token3">[</span>$alias<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> static <span class="token5">function</span> <span class="token4">get</span><span class="token3">(</span>$objectname<span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">isset</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$objects<span class="token3">[</span>objectname<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">throw</span> <span class="token5">new</span> <span class="token4">Exception</span><span class="token3">(</span><span class="token2">"对象不存在"</span><span class="token3">,</span> <span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> self<span class="token3">:</span><span class="token3">:</span>$objects<span class="token3">[</span>objectname<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> namespace IMooc<span class="token3">;</span> class <span class="token4">Factory</span><span class="token3">{</span> static <span class="token5">function</span> <span class="token4">createDatabase</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> <span class="token">//$db = new Database();</span> $db <span class="token1">=</span>Database<span class="token3">:</span><span class="token3">:</span><span class="token4">connectDB</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> Register<span class="token3">:</span><span class="token3">:</span><span class="token4">set</span><span class="token3">(</span><span class="token2">'db1'</span><span class="token3">,</span>$db<span class="token3">)</span><span class="token3">;</span><span class="token">//调用注册类的方法将db对象放进注册树中对象的别名叫db1</span> <span class="token5">return</span> $db<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> 其他任何文件: 获取对象:$db <span class="token1">=</span> \IMooc\Register<span class="token3">:</span><span class="token3">:</span><span class="token4">get</span><span class="token3">(</span><span class="token2">'db1'</span><span class="token3">)</span><span class="token3">;</span> database<span class="token3">.</span>php<span class="token3">:</span> class <span class="token4">Database</span> <span class="token3">{</span> public static $mark <span class="token1">=</span> <span class="token5">null</span><span class="token3">;</span> <span class="token">// 定义标识符(通过$mark值得改变情况,来判定Model类是否被实例化)</span> <span class="token">// __construct()只执行一次</span> private final <span class="token5">function</span> <span class="token4">__construct</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> <span class="token">// 链接数据库</span> <span class="token4">mysql_connect</span><span class="token3">(</span><span class="token2">'localhost'</span><span class="token3">,</span><span class="token2">'root'</span><span class="token3">,</span><span class="token2">''</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'数据库链接成功<br>'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">// 申明静态方法,由类名直接调用此方法,来实例化Model类</span> <span class="token">// 在静态方法中,绝不可以使用$this($this是对象产生之后才会有的)</span> public static <span class="token5">function</span> <span class="token4">connectDB</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// 实例化Model类</span> <span class="token5">if</span> <span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$mark <span class="token1">==</span> <span class="token5">null</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// self:代表自身(self=Model)</span> self<span class="token3">:</span><span class="token3">:</span>$mark <span class="token1">=</span> <span class="token5">new</span> <span class="token4">self</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> self<span class="token3">:</span><span class="token3">:</span>$mark<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">select</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'查询数据'</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">insert</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> <span class="token3">}</span> <span class="token3">}</span> ``` ```