подряд, если в PHP - PullRequest
0 голосов
/ 16 июня 2009

Сейчас я выполняю некоторую проверку в PHP и выполняю множество условных операторов, например:


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

т. Д.

Есть ли хороший способ сделать это? Или мне просто запустить десять операторов If, как те, что указаны выше? Я не могу использовать switch очевидно, но я ищу такой тип решения ..

P.S ... Я использую Zend Framework для проверки

Ответы [ 10 ]

4 голосов
/ 16 июня 2009

Вы можете ИЛИ их так:

if(cond1||
   cond2||
   cond3||
   cond4)
{
  return false;
}
3 голосов
/ 16 июня 2009

Делать что-то подобное называется предложением Guardian. Это может быть улучшено, поэтому предложения, которые возвращают одно и то же значение, должны быть сгруппированы вместе.

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;
}
0 голосов
/ 05 августа 2009

Добавить все объекты в массив и повторить его (я полагаю, вы или Zend используете интерфейс «валидатор» или что-то в этом роде; каждый компонент (имя пользователя, электронная почта и т. Д.) Реализует метод «isValid»):

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

foreach ($validators as $validator)
{
    if (!$validator->isValid())
    {
        return false;
    }
}
0 голосов
/ 05 августа 2009

Сделайте что-то вроде этого:

$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 в операторах
0 голосов
/ 16 июня 2009

Я бы сделал их членами моего класса. Очевидно, что здесь вам понадобится класс, управляемый формой. Так вот, например, электронная почта может быть заключена в класс и инициализирована в конструкторе класса, который имеет их в качестве переменных-членов. Теперь класс оболочки электронной почты выполнит проверку электронной почты при инициализации / создании.

ИМХО, это выглядело бы менее загроможденным, и вы можете обернуть любые проверки или специальные методы в класс email-wrapper.

Я знаю, что это может быть кувалда в некотором контексте; так что выбирайте мудро!

0 голосов
/ 16 июня 2009

Может быть, что-то вроде этого:

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

НО, если вы используете ZF, это ваш единственный ответ, потому что вы проверяете все формы в одном, а не в отдельных полях:

$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
}
0 голосов
/ 16 июня 2009

Всегда полезно использовать некоторые переменные, чем несколько возвращаемых

В случае, если это единственные условия возврата. Нам не нужно проверять все условия. проверка «как» только для истинных условий возвращает по умолчанию ложь или наоборот.

$ result = false; // вернуть false по умолчанию.

if (cond1 || cond2) {// проверять только условия, в результате которых возвращается значение true. :)

  $result = true;

}

вернуть $ результат;

Приветствия

-Ratnesh

0 голосов
/ 16 июня 2009
if ($this->email->isValid($email) || 
    $this->username->isValid($username))
        return false;
0 голосов
/ 16 июня 2009

Просто убедитесь, что вы поместили наиболее очевидную проверку сверху, поэтому, если она потерпит неудачу, она сработает до того, как будет выполнена каждая инструкция. Кроме того, мне не нравятся операторы if без фигурных скобок, но тогда это просто вопрос мнения.

0 голосов
/ 16 июня 2009

Если это данные из формы, взгляните на Zend_Form, как рекомендовано постером в вашем другом вопросе

Я опубликовал пример кода , в котором подробно описано добавление валидаторов в элементы формы

...