2

在 vb.net 工作多年后,我才开始涉足 php。

我想编写一个记录器类,它在我的 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;
}

}

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

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

这里有一个用法示例:

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

谢谢

4

4 回答 4

8

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

于 2010-02-18T01:17:46.230 回答
5

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

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

您也许可以用会话数据做一些……有趣的……事情,让您的记录器按照您想要的方式工作。

祝你好运!

于 2010-02-18T01:15:15.967 回答
1

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

PHP 的应用程序生命周期反映了 HTTP 的应用程序生命周期。对页面/URI 的每个请求都是无状态的。每个请求对其他请求一无所知。这是设计使然。您描述的行为是 PHP 应有的行为。

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

于 2010-02-18T01:16:37.760 回答
0

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

Zend 框架有 Zend_Log,它使用工厂模式并有各种各样的 Writer 对象来记录到数据库、文件系统、电子邮件等。

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

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

于 2010-02-18T05:11:44.763 回答