php 单例模式
<p> Singleton(单例模式):单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。</p><p> </p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Singleton{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">私有属性,用于保存实例</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(128, 0, 128, 1)">$instance</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造方法私有化,防止外部创建实例</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __construct(){}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">公有属性,用于测试</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(128, 0, 128, 1)">$a</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">公有方法,用于获取实例</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getInstance(){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断实例有无创建,没有的话创建实例并返回,有的话直接返回</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(!(self::<span style="color: rgba(128, 0, 128, 1)">$instance</span><span style="color: rgba(0, 0, 0, 1)"> instanceof self)){
self</span>::<span style="color: rgba(128, 0, 128, 1)">$instance</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> self();
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> self::<span style="color: rgba(128, 0, 128, 1)">$instance</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">克隆方法私有化,防止复制实例</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> __clone(){}
}</span></pre>
</div>
<p>测试:</p>
<p>首先创建两个实例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">$first</span> = Singleton::<span style="color: rgba(0, 0, 0, 1)">getInstance();
</span><span style="color: rgba(128, 0, 128, 1)">$second</span> = Singleton::getInstance();</pre>
</div>
<p>给第一个实例中的$a属性赋值,并打印两个实例</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">$first</span>->a = "zs"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<pre>"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$first</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$second</span>);<br><br></pre>
</div>
<p>打印结果为:</p>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190723112251467-1984675542.png"></p>
<p>给第二个赋值,并打印:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">$first</span>->a = "zs"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$second</span>->a = "ls"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "<pre>"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$first</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$second</span>);</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190723112354064-1032919619.png"></p>
<p> PHP的单例模式相对Java比较简单,Java只一个单例模式就有好几种写法,如想了解请自行百度 :)</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/lxhyty/p/11230723.html
頁:
[1]