清新的晨风 發表於 2019-7-23 11:26:00

php 单例模式

<p>  Singleton(单例模式):单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。</p>
<p>  </p>
<div class="cnblogs_code">
<pre>&lt;?<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>-&gt;a = "zs"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;pre&gt;"<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>-&gt;a = "zs"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$second</span>-&gt;a = "ls"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;pre&gt;"<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>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/lxhyty/p/11230723.html
頁: [1]
查看完整版本: php 单例模式