2012-02-08 6 views
1

私は解決できない非常に具体的な問題があります。PHPシングルトンクラス生涯ハック

私はいくつかのクラスから成るPHPシステムを持っています。それらのほとんどは汎用クラスで、自動ロードハンドラを使用してロードされ、グローバルスコープで手動で作成されます(新規演算子)。

しかし、1つのメインと非常に重要なシングルトンクラスもあります。これもグローバルスコープに存在し、最初に作成されます。私はそれが最後まで生きていたい。このクラス(最初に作成されたクラス)は最後に破棄する必要があります。

このクラスは、エラー処理クラスであり、それは、エラーを管理するために使用される唯一の2つのパブリックメソッドを持つ例外をキャッチし、終了を確認し、レポートを送信する、など

しかし、このクラスは、最初に破壊されます最初に作成されたものです。

クラスの寿命に影響を与え、他のすべてのクラスが終了した後で死に至る可能性はありますか?

ありがとうございました。

UPD 延長コードサンプル:

各クラス区切りファイルに定義されて

class longlive { // error processing class 
    private function __construct() {} 

    public static function initialize() { 
     self::$instance = new longlive(); 
    } 

    public function __destruct() { 
     /// check for runtime session errors, send reports to administrators 
    } 

    public static function handler($errno, $errstr, $errfile = '', $errline = '', $errcontext = array()) { 
     /// set_error_handler set this method 
     /// process errors and store 
    } 

    public static function checkExit() { 
     /// register_shutdown_function will register this method 
     /// will trigger on normal exit or if exception throwed 
     /// show nice screen of death if got an uncoverable error 
    } 
} 

class some_wrapper { 
    public function __construct() {} 
    public function __destruct() {} 
} 

class core { 
    private function __construct() { 
     $this->wrapper = new some_wrapper(); 
    } 

    public static function initialize() { 
     self::$core = new core(); 
    } 
} 

スクリプト本体:あなたはを

include_once('path/to/longlive.php'); 
longlive::initialize(); 

include_once('path/to/core.php'); 
core::initialize(); 
+5

「セキュリティ理由は非常に*聞こえないかもしれません...そして、私はあなたが依存性注入の背後にある概念を見ることをお勧めします:彼らはあなたのコーディングをずっと簡単にし、あなたのコードをより柔軟にするでしょう。 – lonesomeday

+0

シングルトンによるセキュリティ?本当に?! – KingCrunch

+0

あなたは非公開のセキュリティ上の理由を忘れて、クラスライフサイクルについて私に相談してください。ありがとう。 – ntvf

答えて

1

を使用していた場合あなたがあなた自身のコードを使用している場合、あなたの唯一のオプションは、おそらくです

Yours::initialize(); 
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 
$application->bootstrap() 
      ->run(); 
unset($application); 
Yours::destroy(); 

を::10あなたはこれを行うことができます

Yours::initialize(); 
runApplication(); // This will contain all other objects in local scope and they 
        // will be destroyed before yours 
Yours::destroy(); 

またはこのようなコードでshutdown handlerをハック:

foreach($GLOBALS as $key => $val){ 
    unset($GLOBALS[ $key]); 
} 

Yours::destroy(); 
+0

グローバルスコープでクラスインスタンスを厳密に作成することはできません。内部で初期化されます。サンプルコードを参照してください。 – ntvf

+0

静的モデル用に固定された@ntvf) – Vyktor

+0

ありがとうと申し訳ありませんが、完全な説明はありません。シャットダウンハンドラを使って何もすることはできません。更新されたサンプルを参照してください。 – ntvf