2010-08-12 107 views
4

我有一個Java背景。所以請耐心等待。應用程序的一次初始化

在Java應用程序中,執行一次初始化的一種方法是擁有一個「初始化器Servlet」,其init()方法可以有一次初始化代碼。另一種更通用的機制是有一個Singleton初始化時使用 - 這種機制可以在各種語言/平臺上工作。我需要知道的是如何爲我的PHP webapp執行此操作。

我應該使用單例模式嗎?是否有另一種/更好的/ PHP的具體方式?基本上我想有一個「註冊表」 - 它的一個實例 - 然後我可以使用它來創建其他對象的實例(它們自己單獨或不依賴於手頭的情況)。

最終目標是 - 我需要某些東西初始化之前任何Web請求由我的PHP Web應用程序服務 - Java中的「初始化器Servlet」保證我。也許有一個「初始化PHP頁面」或類似的東西?

在此先感謝

回答

0

源PHP在常規意義上不生成可執行程序。這是一種腳本語言。但是,您可以創建一個單身人士。

0

PHP的本質不會讓你有像servlets一樣的初始化。在PHP中,一切都將在Web請求中。 正如你所提到的,​​可以幫助你有一個地方放置你的對象,但是,它們會在每個請求中被重新創建。

+0

錯誤,現在我有點困惑。你是說即使Singleton模式不適用於我的註冊表?您是否說Singleton的「範圍」僅限於我的Web請求的控制線程。如果是這樣,我不確定各種PHP框架是如何實現依賴注入的,除非整個對象都是在每個Web請求上構建的。我想使用PHP,但這對我來說會是一個難題,我希望我誤解了你的意見。 – Arby 2010-08-12 00:32:28

+0

通常,整個對象都是在每個請求上構建的。它在CakePHP項目中完成的方式很容易遵循,也許它會提供一些見解。 – sleepynate 2010-08-12 00:39:27

+0

除非在過去的幾年裏有什麼變化(大約3年沒有使用php),我可以告訴你這一點:整個對象層次將在每個請求中產生。 – Fernando 2010-08-12 00:51:44

0

我沒有Java背景,但是在構建中啓動並返回(或保持爲靜態)的其他單例/工廠的單例是常見模式。因爲PHP應用程序中唯一定義的「入口點」是傳遞給解析器的文件,所以很多PHP應用程序都花費很大的精力來重定向到「引導」腳本,該腳本準備好環境並實例化需要的任何單例和靜態對象由應用程序。然後將其包含在入口點以確保它可用於整個應用程序。

<?php // this file is bootstrap.php 
// ... 
class MySingleton { 
    private static $instance; 

    private function __construct() { 
     $this->myFactory1 = new MyFactory1(); 
     $this->myFactory2 = new MyFactory2(); 
     $this->myOtherSingleton = MyOtherSingleton::get(); 
    } 

    public static function get() { 
     if (!isset(self::$instance)) { 
      $c = __CLASS__; 
      self::$instance = new $c; 
     } 
     return self::$instance; 
    } 

    public function __clone() { 
     trigger_error('Clone is not allowed.', E_USER_ERROR); 
    } 
} 

// Before we leave, we'll get an instance! 
$myBootstrapUtility = MySingleton::get(); 
// end of bootstrap.php ?> 

然後在應用程序邏輯的其餘部分之前確保require_once('bootstrap.php');

當然,實際的細節完全取決於你,但這當然不是一種不尋常的做你的事情的方式。

+0

阿!非常感謝您的回覆。只是一個問題。 如果我使用require_once('bootstrap.php')它不同於include('bootstrap.php')所有我的php腳本?如果答案是肯定的,那麼這意味着我的網站的任何用戶首次達到索引。PHP,我的辛格爾頓將被初始化,永遠不會。無論如何,如果我的問題不存在明確的答案(你確實說過人們長篇大論,但沒有提及這些長度),那麼我不知道像Zend,Symfony等各種框架聲稱做「DI一次」 。 – Arby 2010-08-12 00:42:38

+0

通常,如果它是一個web應用程序,確保入口點是通過諸如'.htaccess'之類的東西來實現的。 'require_once'確保相應的引導程序被加載,並且只加載一次,以便其他包含相同文件的程序不會覆蓋並重新實例化對象。這兩種方式都是可以接受的,但常用的方法傾向於'.htaccess'。一個明確的答案可能不存在,因爲它是一種具有不同意識形態的不同語言,但這是實現類似的方式之一(這遠遠超出了PHP的原始目標)。 – sleepynate 2010-08-12 01:10:09

+0

查看http://book.cakephp.org/view/21/A-Typical-CakePHP-Request,http://github.com/cakephp/cakephp/blob/master/cake/bootstrap.php,以及地點他們實際上在所有的對象層次構建之後處理把用戶發送到正確的地方......稍大一點的http://github.com/cakephp/cakephp/blob/master/cake/dispatcher.php(注意到這個用法的應用程序註冊表) – sleepynate 2010-08-12 01:13:35