【问题标题】:Correct design for a validation class?验证类的正确设计?
【发布时间】:2012-06-01 09:02:51
【问题描述】:

我想创建一个验证表单输入的类(请不要再发明轮子)。

我认为拥有一个具有静态验证方法的类更有意义,而不是因为该对象不包含任何数据而必须实例化一个验证对象?

例如,例如:

<?php

class Validator {

    static function is_numeric($val) {

        if(is_numeric($val))
            return true;

    }

}

允许我使用:

if(!Validator::is_numeric($_POST['age'])) $error['age'] = "Age must be a number";

鉴于:

<?php

class Validator {

    public function is_numeric($val) {

        if(is_numeric($val))
            return true;

    }

}

这意味着必须实例化一个类的实例才能使用这些函数——我认为这是对系统内存的毫无意义的使用? :

$validator = new Validator();
if(!$validator->is_numeric($_POST['age'])) $error['age'] = "Age must be a number";

我的示例验证方法是一个糟糕的例子,因为它除了使用标准的 PHP is_numeric 函数之外什么都不做,但这只是为了说明我的观点。

静态方法类是更好的选择吗?如果不是,为什么?

【问题讨论】:

  • 在 PHP 中你可以定义没有类的函数。 valide_is_numeric(data) 似乎更有意义。
  • 我知道,但是将所有相似(即验证)函数分组在一个类中更有意义。命名空间也可以实现同样的效果,但在我看来,类更适合这个实例。

标签: php class static static-methods


【解决方案1】:

我建议不仅将您的验证方法设为静态,而且还允许对类进行实例化。

假设我们称我们的类为“Field”。然后,最好有一个带有参数的构造函数:field_name、widget_type、validator_type 以及您想要的任何其他内容。那么你可以只创建 Field 对象并调用 'validate()' 或其他类似命名的函数。

例如:

$email_field = new Field('Email','entry','email_validator');
$email_field.validate();

然后构造函数可以从请求变量中获取它的值,验证函数将寻找一个名为“email_validator”的静态验证器。更好的办法是将验证器放在构造函数中......

【讨论】:

    【解决方案2】:

    我认为,如果您在验证器类的特定实例上使用多个函数调用。最好使用单例方法或者只创建一个实例(即$validator = new Validator;);

    从内存方面来说,这将是最好的选择,我会说,如果您(假设)对类有 100 个单独的静态调用,而不是 1 个实例调用 100 个,那么您最好创建一个新的实例。

    【讨论】:

    • 您对内存效率的说法有任何证据吗?
    【解决方案3】:

    对我来说,使用验证器类似乎是更好的选择。如果不需要类变量,您可以在不实例化的情况下使用它。如果您不需要该类的长期实例,则它不需要 RAM 中的任何空间。

    【讨论】:

      【解决方案4】:

      考虑代码的可维护性和可读性。构建框架和类等总是很诱人,但是在 100 个 LOC 而不是 40 个 LOC 中嵌入相同的功能并不总是好的选择。这个决定应该取决于你的验证者会做什么。

      如果它没有内部状态,也没有复杂的参数,就不要创建类。

      一个简单的函数不仅更易于分析,它还可以让用户知道没有副作用,他不必阅读比他打算使用的函数更多的文档。

      保持简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 2011-06-27
        • 2015-08-24
        相关资源
        最近更新 更多