查看完整版本: 还是说php实现singleton模式

铁血霸主 2007-8-1 22:11

还是说php实现singleton模式

             <p><span class="t18"><p>这天考虑用<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'php');" target="_self"><u><strong>php</strong></u></a>来singleton一下,看到一篇比较全面的总结 -- singleton模式的几种实现.其中总结的php5的实现:</p><p>PLAIN TEXTPHP:</p><p>class MyClass <br>&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp; private static $instance;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static function singleton()<br>&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!isset(self::$instance)) { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c = __CLASS__;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self::$instance = new $c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self::$instance;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; } </p><p>这段<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B4%FA%C2%EB');" target="_self"><u><strong>代码</strong></u></a>拿来使用,不会太爽,因为一般都会继承自MyClass,而$c = __CLASS__;获取的始终是基类的类名,不可用。只能考虑找其它实现<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B7%BD%B7%A8');" target="_self"><u><strong>方法</strong></u></a>。</p><p><br>接着俺开始查看文章中的函数方式实现的singleton,实现的很不错,缺点是类被实例化时不能带参数,这里贴上俺的版本:</p><p>PLAIN TEXTPHP:</p><p>function getObj() {<br>&nbsp;&nbsp;&nbsp; static $obj = array();<br>&nbsp;&nbsp;&nbsp; $args = func_get_args();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if(empty($args)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; $clazz = $args[0];<br>&nbsp;&nbsp;&nbsp; if(!is_object($obj[$clazz])) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cnt = count($args);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($cnt&gt; 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for($i = 1, $s = ''; $i &lt;$cnt; $i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $s[] = '$args[' . $i . ']';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eval('$obj[$clazz] = new $clazz(' . join(',', $s) . ');');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $obj[$clazz] = new $clazz;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; return $obj[$clazz];<br>} </p><p>在php5下可以很爽的调用: </p><p>PLAIN TEXTPHP:</p><p>getObj('MyClass', $param1, $param2)-&gt;myMethod(); </p><p>以前的幼稚版:<br>单子模式(SINGLETON)的简单实现 </p></span><div>
页: [1]
查看完整版本: 还是说php实现singleton模式
PageRank