ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 注册树模式 ## 注册树模式 #### 注册树模式是通过将对象实例注册到一个全局的对象树上 #### 需要的时候从对象树上采摘下来使用 ## 为了简化 依然是把类名写到extend目录下 创建 YueRegister类文件(简单逻辑 包括 挂载。读取。和删除) ``` <pre class="calibre13">``` <span class="token"><</span><span class="token">?</span>php <span class="token2">class</span> <span class="token3">YueRegister</span> <span class="token1">{</span> <span class="token6">/** 简单注册树模式设计代码 * 注册树池子 后续会把实例对象注册到objects中 */</span> <span class="token2">protected</span> <span class="token2">static</span> $objects <span class="token">=</span> <span class="token2">null</span><span class="token1">;</span> <span class="token6">// 将对象挂载到树上</span> <span class="token2">public</span> <span class="token2">static</span> <span class="token2">function</span> <span class="token2">set</span><span class="token1">(</span>$key<span class="token1">,</span>$obj<span class="token1">)</span><span class="token1">{</span> self<span class="token1">:</span><span class="token1">:</span>$objects<span class="token1">[</span>$key<span class="token1">]</span> <span class="token">=</span> $obj<span class="token1">;</span> <span class="token1">}</span> <span class="token6">// 从对象树上获取实例</span> <span class="token2">public</span> <span class="token2">static</span> <span class="token2">function</span> <span class="token2">get</span><span class="token1">(</span>$key<span class="token1">)</span><span class="token1">{</span> <span class="token2">if</span> <span class="token1">(</span><span class="token">!</span><span class="token3">isset</span><span class="token1">(</span>self<span class="token1">:</span><span class="token1">:</span>$objects<span class="token1">[</span>$key<span class="token1">]</span><span class="token1">)</span><span class="token1">)</span><span class="token1">{</span> self<span class="token1">:</span><span class="token1">:</span>$objects<span class="token1">[</span>$key<span class="token1">]</span> <span class="token">=</span> <span class="token2">new</span> $key<span class="token1">;</span> <span class="token1">}</span> <span class="token2">return</span> self<span class="token1">:</span><span class="token1">:</span>$objects<span class="token1">[</span>$key<span class="token1">]</span><span class="token1">;</span> <span class="token1">}</span> <span class="token6">// 从对象树上删除 注销</span> <span class="token2">public</span> <span class="token2">static</span> <span class="token2">function</span> <span class="token3">_unset</span><span class="token1">(</span>$key<span class="token1">)</span> <span class="token1">{</span> <span class="token3">unset</span><span class="token1">(</span>self<span class="token1">:</span><span class="token1">:</span>$objects<span class="token1">[</span>$key<span class="token1">]</span><span class="token1">)</span><span class="token1">;</span> <span class="token1">}</span> <span class="token1">}</span> ``` ``` ### 在extend目录下 创建一个A.php类文件 ``` <pre class="calibre13">``` <span class="token"><</span><span class="token">?</span>php <span class="token2">class</span> <span class="token3">A</span> <span class="token1">{</span> <span class="token2">public</span> <span class="token2">function</span> <span class="token3">register</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span> <span class="token2">return</span> <span class="token4">'abc'</span><span class="token1">;</span> <span class="token1">}</span> <span class="token1">}</span> ``` ``` ### 在index首页控制器方法中 测试 ``` <pre class="calibre13">``` <span class="token"><</span><span class="token">?</span>php namespace app\index\controller<span class="token1">;</span> <span class="token2">class</span> <span class="token3">Index</span> <span class="token1">{</span> <span class="token2">public</span> <span class="token2">function</span> <span class="token3">index</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span> $a <span class="token">=</span> <span class="token2">new</span> <span class="token3"><span class="token1">\</span>A</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> <span class="token6">// 把$a挂在到注册树上面</span> \YueRegister<span class="token1">:</span><span class="token1">:</span><span class="token2">set</span><span class="token1">(</span><span class="token4">'sinwa'</span><span class="token1">,</span>$a<span class="token1">)</span><span class="token1">;</span> <span class="token6">// 从树上拿到并进行使用</span> $abc <span class="token">=</span> \YueRegister<span class="token1">:</span><span class="token1">:</span><span class="token2">get</span><span class="token1">(</span><span class="token4">'sinwa'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">register</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> echo $abc<span class="token1">;</span> <span class="token1">}</span> <span class="token1">}</span> ``` ``` ### 以上会输出 abc 如果把上面的 ``` <pre class="calibre13">``` $abc <span class="token">=</span> \YueRegister<span class="token1">:</span><span class="token1">:</span><span class="token2">get</span><span class="token1">(</span><span class="token4">'sinwa'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">register</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> ``` ``` 改成 ``` <pre class="calibre13">``` $abc <span class="token">=</span> \YueRegister<span class="token1">:</span><span class="token1">:</span><span class="token2">get</span><span class="token1">(</span><span class="token4">'A'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">register</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> ``` ``` 就会走注册上面的 当查询不到的时候 就执行创建 依然可以正常的输出