铁血霸主 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> { <br> private static $instance;<br> <br> public static function singleton()<br> { <br> if (!isset(self::$instance)) { <br> $c = __CLASS__;<br> self::$instance = new $c;<br> }<br> return self::$instance;<br> <br> }<br> } </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> static $obj = array();<br> $args = func_get_args();<br> <br> if(empty($args)) <br> return null;<br> <br> $clazz = $args[0];<br> if(!is_object($obj[$clazz])) {<br> $cnt = count($args);<br> if($cnt> 1) {<br> for($i = 1, $s = ''; $i <$cnt; $i++) <br> $s[] = '$args[' . $i . ']';<br> eval('$obj[$clazz] = new $clazz(' . join(',', $s) . ');');<br> } else {<br> $obj[$clazz] = new $clazz;<br> }<br> }<br> <br> return $obj[$clazz];<br>} </p><p>在php5下可以很爽的调用: </p><p>PLAIN TEXTPHP:</p><p>getObj('MyClass', $param1, $param2)->myMethod(); </p><p>以前的幼稚版:<br>单子模式(SINGLETON)的简单实现 </p></span><div>