2010-02-18 99 views
2

我只是在vb.net工作了很久之后才开始潜心于php。PHP Singleton:没有举办实例

我想要写为singleon在我的web应用程序运行时,这里的代码记录器类:

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; 
} 

} 

我想到的是,因为我是做多次打电话给堵塞我的应用程序的页面之间切换:: trace()方法,数据数组增加,并且它充满了所有的痕迹。但是我得到的是:每当我运行一个页面时,$ instance都是null,因此对象重新启动(如您所见,我在实例getter中放置了一个回显“空行”:它每次显示)

I想有什么东西我误解的PHP应用程序生命周期....

这里有一个使用示例:

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

感谢

回答

8

PHP使用“无共享”体系结构。这意味着(除其他外)在页面加载之间不分享任何内容。与.NET不同的是,应用程序在第一页启动并运行,直到停止,只是在请求到来时提供服务。在PHP中,每次请求页面时,应用程序都将从头开始编译和运行。

5

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

一般来说,每次加载新页面时,所有内容都从头开始。

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

祝你好运!

1

但我得到的是:每次我运行一个页面时,$实例为null,那么对象重新启动 ... 我想有什么东西我误解的PHP应用程序生命周期....

PHP的应用程序生命周期反映了HTTP的应用程序生命周期。每个对页面/ URI的请求都是无状态的。每个请求都不了解其他请求。这是设计。你描述的行为是PHP按照它的行为行事。

您需要采取额外步骤让每个请求都知道其他请求中发生了什么。 (PHP的会话处理是这样做的一种方式)

0

而不是解决你在PHP中的应用程序生命周期问题,我想提出一个建议,使用预建日志类。

Zend框架有Zend_Log,它使用Factory模式,并有各种Writer对象登录到数据库,文件系统,电子邮件等等。

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

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

+0

这是一个很好的建议,但我的purpouse是与php的功能联系。如果我开始复制代码,我相信我会发现自己陷入麻烦,调试一些脚本,我甚至不知道它们是如何工作的。 也许我会看看并获得灵感,但是我的课程中的真正问题(因此,我的问题)是我不明白我不再用.NET开发! – balanza 2010-02-22 14:57:22

相关问题