2016-09-22 15 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我是一个应负责任的投票。我的论点可以在我之前的评论中找到。另外:你是对的,数据库是单身人士有意义的少数例子之一。 –