2

vb.netで何年も働いた後、私はちょうどphpに飛び込み始めています。

webapp でシングルオンとして実行されるロガー クラスを書きたいと思います。コードは次のとおりです。

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であるため、オブジェクトが再起動することです(ご覧のとおり、インスタンスゲッターにエコー「空!」行を入れました:毎回表示されます)

私はphpアプリケーションライフサイクルで誤解しているものがあると思います....

ここに使用例があります:

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

ありがとう

4

4 に答える 4

8

PHP は「何も共有しない」アーキテクチャを使用します。これは、(特に)ページの読み込み間で何も共有されないことを意味します。.NET とは異なり、アプリケーションは最初のページ ヒットで開始され、停止するまで実行され、要求が来たときにサービスを提供するだけです。PHP では、ページが要求されるたびに、アプリケーションは基本的にコンパイルされ、ゼロから実行されます。

于 2010-02-18T01:17:46.230 に答える
5

PHP のライフ サイクルは、「ページ開始からロード」から「ページ終了ロード」までです。

一般的に言えば、新しいページをロードするたびに、すべてがゼロから始まります。

ロガーを思い通りに動作させるために、セッション データを使用していくつかの... 興味深い... ことを実行できる場合があります。

幸運を!

于 2010-02-18T01:15:15.967 に答える
1

しかし、私が得たのは、ページを実行するたびに $instance がnullであるため、オブジェクトが再起動するということです.phpアプリケーションライフサイクルで誤解しているものがあると思います....

PHP のアプリケーション ライフサイクルは、HTTP のライフサイクルを反映しています。ページ/URI の各リクエストはステートレスです。各リクエストは、他のリクエストについて何も知りません。これは仕様によるものです。あなたが説明した動作は、本来あるべきように動作する PHP です。

他のリクエストで何が起こったかを各リクエストに知らせるには、追加の手順を実行する必要があります。(PHP のセッション処理は、これを行う 1 つの方法です)

于 2010-02-18T01:16:37.760 に答える
0

PHP でのアプリケーション ライフ サイクルに関する質問に答える代わりに、ビルド済みのログ クラスを使用することをお勧めします。

Zend Framework には、Factory パターンを使用する Zend_Log があり、データベース、ファイルシステム、電子メールなどにログを記録するためのさまざまな Writer オブジェクトがあります。

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

ライブラリの他の部分を必要とせずに Zend_Log を使用できるため、現在のシステムに簡単に適応できるはずです。

于 2010-02-18T05:11:44.763 に答える