2016-09-22 14 views
1

我寫了一個類來驗證表單輸入,它知道某些字段(輸入數組中的鍵)並允許爲它指定規則。這將允許創建一個驗證者來處理聯繫人數據,例如字段爲"title""name""email"對象作爲(全局)常量在php中

我設計的想法是,這個驗證器可以重複使用在網站上傳播的多種形式。畢竟,這些表格中的許多可能需要填寫一些聯繫數據。我唯一沒有想到的是,php不允許用對象初始化常量或靜態字段。

我希望將它指定在某些文件utils.php用我的驗證作爲

const CONTACT_VALID = new Validator(...); 

,這樣我可以只require "utils.php"離不開它被初始化每次訪問此常數。這顯然不起作用,並且對於靜態變量也是行不通的。 我也想過像

static CONTACT_VALID = NULL; 
static function get_contact_valid() { 
    if (is_null(CONTACT_VALID)) 
     CONTACT_VALID = new Validator(); 

    return CONTACT_VALID; 
} 

,但我不能完全肯定這是否會產生預期的效果,因爲我是比較新的PHP(和網絡技術在一般)。

所以我的問題:有沒有可能有一個對象,使我可以在網站上的任何地方使用它,而無需一次又一次地初始化它?

回答

0

認爲應該來是實際上它沒有意義不具有對多頁使用一些全局常量驗證答案。經過更多的四處看,我發現,

  1. php常量是編譯時常量,因此不適合存儲對象。
  2. 靜態變量具有請求的生命週期,因此不能跨多個頁面使用。

因此,有必要爲每個請求初始化一個驗證器。如果驗證器初始化創建成本非常昂貴,則可能會將該對象序列化爲某個文件並將其反序列化以將其恢復。但是,我認爲這個建議是(或應該)實際上是不相關的。

另一方面,如果在一次請求過程中可以多次使用同一個驗證器,那麼考慮一個靜態變量和附帶的方法來訪問它,如問題中已經提到的那樣。如果

道歉,我的問題不是十分清楚

0

您不能在constants中存儲非標量值,但可以使用Singleton pattern

<?php 
class Singleton 
{ 
    /** 
    * @var Singleton The reference to *Singleton* instance of this class 
    */ 
    private static $validator; 

    /** 
    * Returns the *Singleton* instance of this class. 
    * 
    * @return Singleton The *Singleton* instance. 
    */ 
    public static function getValidator() 
    { 
     if (null === static::$validator) { 
      static::$validator = new Validator(); 
     } 

     return static::$validator; 
    } 

    /** 
    * Protected constructor to prevent creating a new instance of the 
    * *Singleton* via the `new` operator from outside of this class. 
    */ 
    protected function __construct() 
    { 
    } 

    /** 
    * Private clone method to prevent cloning of the instance of the 
    * *Singleton* instance. 
    * 
    * @return void 
    */ 
    private function __clone() 
    { 
    } 

    /** 
    * Private unserialize method to prevent unserializing of the *Singleton* 
    * instance. 
    * 
    * @return void 
    */ 
    private function __wakeup() 
    { 
    } 
} 
+0

不知道是誰給了downvote - 這是正確的答案。這正是單身人士的目的。 「常量」(它不是真的)對象最普遍使用的是數據庫連接。你不想在十幾個不同的類中連接你的數據庫,所以你需要保存一個記錄你的數據庫連接的單例。緩存也很常見。 –

+0

首先,這不是單一模式,因爲它在OOP中是已知的(對於我來說,這仍然是GoF描述的模式)。我寧願將它稱爲實例類或Factory模式的一些簡單應用。此外,單例模式通常被認爲是[反模式](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons)。同樣在這種情況下,我可能需要多個驗證器實例(聯繫信息,航班信息,投訴等)。總結:工廠模式可能會導致更好的答案... –

+0

@JoshfromQaribou我是一個應負責任的投票。我的論點可以在我之前的評論中找到。另外:你是對的,數據庫是單身人士有意義的少數例子之一。 –