2012-02-08 2 views
1

У меня есть очень специфическая проблема, которую я не могу решить.PHP singleton class lifetime hack

У меня есть система PHP, состоящая из нескольких классов. Большинство из них являются родовыми классами и загружаются с помощью обработчика автозагрузки и создаются в глобальной области вручную (новый оператор).

Но у меня также есть один основной и очень важный одноэлементный класс, который также существует в глобальном масштабе и создается первым. Я хочу сделать это до конца. Этот класс (созданный первым) должен быть уничтожен последним.

Этот класс является классом обработки ошибок, и есть только два общих методов, которые будут использоваться для управления ошибками, перехватывать исключения, проверьте выход, отправлять отчеты и т.д.

Но этот класс уничтожит первую как это было создано в первую очередь.

Возможно ли повлиять на продолжительность жизни класса и заставить его умереть после того, как все другие классы умерли?

Спасибо.

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

Безопасность от Singleton? В самом деле?! – KingCrunch

+0

вы можете забыть о нераскрытых соображениях безопасности и посоветоваться со мной о жизненном цикле класса? Благодарю. – ntvf

ответ

1

Если вы использовали Zend Framework вы можете сделать это:

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

Если вы используете свой собственный код, единственный вариант, вероятно:

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