验证类的正确设计?

时间:2012-06-01 09:02:51

标签: php class static static-methods

我想创建一个将验证表单输入的类(请不要发表关于重新发明轮子的评论)。

我认为使用静态验证方法更有意义,而不必实例化验证对象,因为对象不会保存任何数据?

例如,像:

<?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函数之外它没有任何作用,但这只是为了说明我的观点。

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

4 个答案:

答案 0 :(得分:1)

我建议不仅要使验证方法保持静态,还要允许实例化类。

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

例如:

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

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

答案 1 :(得分:0)

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

记忆明智这将是最好的选择,我会说,如果你有(比方说)100个单独的静态调用,而不是1个实例,100个调用,你最好创建一个新的实例

答案 2 :(得分:0)

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

答案 3 :(得分:0)

考虑代码的可维护性和可读性。它总是很容易构建框架和类等等,但在100 LOC而不是40中嵌入相同的功能并不总是很好的选择。决定应取决于您的验证员将做什么。

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

一个简单的函数不仅分析起来更简单,它还会让用户知道没有副作用,他不需要阅读比他打算使用的函数更多的文档。

保持简单。