我在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();
由于
答案 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而无需库的任何其他部分,因此应该很容易适应您当前的系统。