PHP Singleton:没有持有实例

时间:2010-02-18 00:58:42

标签: php singleton restart

我在vb.net工作了很长时间后才开始潜入php。

我想编写一个记录器类,在我的webapp上运行为singleon,这里是代码:

class cLog{

private $data = NULL;


static private $instance = NULL;

static public function getInstance(){
    if(self::$instance == NULL){
        echo "empty!";
        self::$instance = new cLog();           
    }   
    return self::$instance;
}


private function __construct(){     
}   
private function __clone(){     
}



public function getData(){
    return self::getInstance()->data;
}

public function trace($o){
    self::getInstance()->data[] = $o;
}

}

我期望的是,当我在我的应用程序的页面之间切换,这些页面多次调用cLog :: trace()方法时,数据数组会增加,并且所有跟踪都会填充。但我得到的是:每当我运行一个页面时,$ instance为null所以对象重新启动(如你所见,我在实例getter中放了一个echo“empty!”行:它每次都显示)

我想我在php应用程序生命周期中有一些误解......

这里有一个用法示例:

cLog::getInstance()->trace("hello world");
$logs = cLog::getInstance()->getData();

由于

4 个答案:

答案 0 :(得分:8)

PHP使用“无共享”架构。这意味着(除其他外)页面加载之间没有共享。与.NET不同,应用程序在第一页上启动并运行直到停止,只是在请求到来时为它们提供服务。在PHP中,每次请求页面时,应用程序基本上都是编译并从头开始运行。

答案 1 :(得分:5)

PHP生命周期从“页面开始加载”到“页面结束加载”。

一般来说,每次加载新页面时,一切都从头开始。

您可以使用会话数据做一些有趣的事情,让您的记录器以您希望的方式工作。

祝你好运!

答案 2 :(得分:1)

  

但我得到的是:每次运行页面时,$ instance为null,因此对象重新启动   ...   我想在php应用程序生命周期中我有一些误解......

PHP的应用程序生命周期反映了HTTP的应用程序生命周期。每个页面/ URI请求都是无状态的。每个请求都不知道其他请求。这是设计的。您描述的行为是PHP正常运作。

您需要采取额外步骤让每个请求都知道其他请求中发生的事情。 (PHP的会话处理是一种方法)

答案 3 :(得分:0)

我不想在PHP中解决有关应用程序生命周期的问题,而是建议使用预构建的日志记录类。

Zend Framework具有Zend_Log,它使用Factory模式并具有各种Writer对象来记录数据库,文件系统,电子邮件等。

http://framework.zend.com/manual/en/zend.log.writers.html

您可以使用Zend_Log而无需库的任何其他部分,因此应该很容易适应您当前的系统。