2012-06-01 105 views
1

我想创建一个验证表单输入的类(请不要评论重新发明轮子)。验证类的正确设计?

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

因此,举例来说,像这样:

<?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功能,但这只是为了说明我的观点的缘故。

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

+0

在PHP中,您可以定义没有类的函数。 'valide_is_numeric(数据)'似乎更有意义。 –

+0

我知道,但将班级中的所有类似(即验证)功能分组更有意义。用命名空间也可以实现同样的功能,但在我看来,这个实例更适合类。 – Anonymous

回答

0

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

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

+1

有关您的内存效率声明的任何证据? –

0

使用验证程序类似乎是我的更好选择。如果没有需要的类变量,则可以在不实例化的情况下使用它。如果你不需要这个类的长时间实例,它不需要RAM中的任何空间。

1

我会建议不仅让您的验证方法静态,而且还允许实例化类。

让我们假装我们称我们班'场'。然后有一个带有参数的构造函数是很好的:field_name,widget_type,validator_type和其他任何你想要的。那么你可以创建Field对象并调用'validate()'或其他一些类似命名的函数。

如:

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

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

0

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

如果它没有内部状态,也没有复杂的参数,请不要制作类。

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

保持简单。