php

时间:2016-09-22 08:37:20

标签: php

我写了一个类来验证表单输入,它知道某些字段(输入数组中的键)并允许为它指定规则。这将允许创建一个处理联系人数据的验证器,例如,使用字段"title""name""email"

我的设计理念是,这个验证器可以重复用于在网站上传播的多种形式。毕竟,许多这些表单可能需要填写一些联系人数据。我唯一没想到的是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(以及一般的网络技术)相对较新。

所以我的问题:是否有可能有一个对象,以便我可以在网站的任何地方使用它而无需一次又一次地初始化它?

3 个答案:

答案 0 :(得分:1)

你需要使用静态类 http://php.net/manual/en/language.oop5.static.php

class Validator
{ 
    static function foo() 
   {
      echo 'bar'; 
   }
}

通过致电:

使用它
Validator::foo();

要将其称为“任何地方”,您可能需要包含班级文件或使用自动加载。

答案 1 :(得分: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()
    {
    }
} 

答案 2 :(得分:0)

应该得到的答案实际上是在多个页面上使用一些全局常量验证器是没有意义的。经过一番回顾,我发现了

  1. php常量是编译时常量,因此不适合存储对象。
  2. 静态变量具有请求的生命周期,因此不能跨多个页面使用。
  3. 因此,有必要为每个请求初始化验证器。如果验证器初始化的创建成本非常高,则可以选择将对象序列化为某个文件并对其进行反序列化以将其取回。但是,我认为这个建议实际上(或者应该)实际上是无关紧要的。

    另一方面,如果在一个请求期间可以多次使用相同的验证器,那么考虑一个静态变量并使用附带的方法来访问它可能是有意义的,如问题中已经建议的那样。

    如果我的问题不是很清楚,请道歉