0

我现在在 PHP 中进行一些验证,并且正在运行分配条件语句,例如:


if ($this->email->isValid($email))
return false;
if ($this->username->isValid($username))
return false;

等等。。

有没有很好的方法来做到这一点?还是我只运行十个像上面那样的 If 语句?我显然不能使用switch,但我正在寻找那种类型的解决方案..

PS ..我正在使用 Zend Framework 进行验证

4

10 回答 10

4

你可以像这样 OR 他们:

if(cond1||
   cond2||
   cond3||
   cond4)
{
  return false;
}
于 2009-06-16T09:17:09.753 回答
3

做这样的事情被称为监护人条款。它可以改进,因此返回相同值的子句应该组合在一起。

if ($this->email->isValid($email) || $this->username->isValid($username))
{
    return false;
}

或者像这样,如果有很多(顺便说一句,我如何格式化 if 只是为了让它更好地阅读,任何其他方式也应该没问题)

if (
    $this->email->isValid($email) || 
    $this->username->isValid($username) || 
    $this->somethingelse()
   )
{
    return false;
}
于 2009-06-16T10:58:48.753 回答
0

做这样的事情:

$errlvl = 0;

if($errlvl == 0 && $this->email->isValid($email)){
    $errlvl++;
}

if($errlvl == 0 && $this->username->isValid($username)){
    $errlvl++;
}

// your validation list keeps going

if($errlvl > 0){
    return false;
}

这将

  1. 减少冗余,因为如果前面有错误,后面的就不会检查了。
  2. 你可以继续添加到列表中
  3. 如果您想知道发生了多少错误,可以在语句中删除 $errlvl == 0
于 2009-08-05T11:41:10.313 回答
0

我会让他们成为我班级的数据成员。显然在这里你必须有一个表单驱动的类。因此,例如,这里可以将电子邮件包装到一个类中,并在将它们作为成员变量的类的构造函数中进行初始化。现在电子邮件包装类将在初始化/构造时对电子邮件进行验证。

恕我直言,这看起来不那么混乱,您可以将任何验证或特定方法包装到电子邮件包装器类中。

我知道在某些情况下它可能是一把大锤。所以明智地选择!

于 2009-06-16T12:30:17.930 回答
0

也许是这样的:

foreach( $form->getElements as $element => $value )
{ 
    if( !$element->isValid( sanitize($value))){
       return false;
    }
}

但是,如果您使用的是 ZF,这是您的 oneliner 答案,因为您在一个而不是单个字段中检查所有表单:

$form = new My_Zend_Form(); // in the controller action that you send the form to

if ( $form->isValid($_POST)) {
    // Success /// do whatever you want with the data
    $data = $form->getValues();
} else {
    //error
}
于 2009-06-16T10:18:38.537 回答
0

如果这是来自表单的数据,请查看 Zend_Form,正如您其他问题中的海报所推荐的那样

我发布了一些示例代码,详细说明了向表单元素添加验证器

于 2009-06-16T09:17:35.773 回答
0

只需确保将最明显的验证放在顶部,因此如果它失败,它会在运行每个语句之前跳闸。另外,我不喜欢没有大括号的 if 语句,但这只是一个见仁见智的问题。

于 2009-06-16T09:17:49.503 回答
0
if ($this->email->isValid($email) || 
    $this->username->isValid($username))
        return false;
于 2009-06-16T09:18:04.353 回答
0

使用一些 var 总比多次返回好

如果这些是唯一的返回条件。我们不需要检查所有条件。像只检查真条件默认返回假,反之亦然。

$结果=假;//默认返回false。

if (cond1 || cond2) { //仅检查导致返回 true 的条件。:)

  $result = true;

}

返回$结果;

干杯,

-拉特内什

于 2009-06-16T09:26:45.053 回答
0

将所有对象添加到数组并对其进行迭代(我猜你或 Zend 正在使用接口“验证器”或类似的东西,每个组件(用户名、电子邮件等)都实现了“isValid”方法):

$validators = array();
$validators[] = $this->email;
$validators[] = $this->username;

foreach ($validators as $validator)
{
    if (!$validator->isValid())
    {
        return false;
    }
}
于 2009-08-05T14:58:19.313 回答