PHP需要单例模式吗?

2009年03月19日  |  10:33 上午分类:Develop  |  标签:  |  

先看看什么是单例模式
单例模式的存在在一些情况下是比较有意义的,如BlogEngine的站点配置就是采用的单例模式,而且它的载入和保存的代码是相当经典的,有兴趣可以看看它的源代码。
由于asp.net是编译型的,所以单例一直会存在于这个应用程序的生命周期里,真正可以做到这个实例在应用程序生命周期中的唯一性。

php的单例模式的实现大致如下:

class Stat{
static $instance = NULL;

static function getInstance(){
if(self::$instance == NULL){
self::$instance = new Stat();
}
return self::$instance;
}

private function __construct(){
}

private function __clone(){
}

function sayHi(){
return "The Class is saying hi to u ";
}
}
echo Stat::getInstance()->sayHi();

代码来自:http://www.cnblogs.com/cocowool/archive/2009/03/18/1415660.html
但,PHP是一种解释型的语言,在这里用单例好像看不出实际的用处,一旦整个页面执行完,变量也就消失了。

static function getInstance(){
if(self::$instance == NULL){
self::$instance = new Stat();  //这里随着页面的重载会再次执行
}
return self::$instance;
}

我接触PHP时间不长,以上写出来的只是在C#与PHP二种不同语言环境下对单例模式的认知,也许这个例子只是为了说明模式可以用很多种语言来实现,但并不意味着在各种语言环境下都能真正起作用。
asp.net中的单例是在整个应用程序域唯一。PHP中的单例只在整个页面周期内唯一

转载时务必以超链接形式标明文章原始出处和作者信息。

10 位领导已批示 关于 “PHP需要单例模式吗?”

  1. 思臣 发表于: 三月 19th, 2009 1:17 下午

    至今尚未见着“单例模式”在PHP中的应用:zzz:

  2. 幻想曲 发表于: 三月 19th, 2009 4:03 下午

    应用不多,主要是由于其运行环境与语言特点所决定。
    解释型的语言,是很难将一些变量一直驻留在内存中的。

  3. sasumi 发表于: 三月 19th, 2009 5:47 下午

    在DB 对象里面用过。
    这个比较有用。 譬如在一个程序里面,可能有好多地方都涉及到 $db = new DB(); 这样消耗的资源是比较大的。 所以我就弄了一个 $db = DB::getInstance();

  4. beyondye 发表于: 三月 19th, 2009 6:25 下午

    有用,很多php框架就用到单列模式

  5. 幻想曲 发表于: 三月 19th, 2009 6:32 下午

    php中的单例不可能是绝对意义上的单例吧。
    大家可以在getInstance()方法中echo一下,看是不是每次加载页面都实例化了类。
    static function getInstance()
    {
    if(self::$instance == NULL){
    echo ‘实例化了’;
    self::$instance = new Stat(); //这里随着页面的重载会再次执行
    }
    }

  6. 星辉一冷 发表于: 三月 19th, 2009 11:23 下午

    你所指的那种单例是一种静态的, 而 PHP 本来就是运行时的, (通常)不能跨进程, 所以是线程安全的.
    单就单例的意义上来说, PHP 的实现也是符合标准的.

    这点就有点像 Javascript 中的单例一样…
    var obj = {};
    不过并不严谨

  7. 幻想曲 发表于: 三月 20th, 2009 7:15 上午

    @星辉一冷:
    En,有道理。

  8. Sobizz 发表于: 五月 4th, 2009 10:14 下午

    在面向对象上用得比较多。不要过一般程序没怎么用面向对象

  9. 幻想曲 发表于: 五月 5th, 2009 8:37 上午

    php中面象对象的开源程序还是比较多的,如phpbb/wp等。

  10. zwws 发表于: 五月 6th, 2009 8:35 上午

    OO比较多的情况下用单例解决作用域的问题也不错嘛~嘿嘿。


发表您的评论

1410168172122013183195114157619