2013-06-21 4 views
3

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

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

EDIT: Люди сказали мне, что я могу перемещать пустой ($ _ POST ['email']) в функции проверки. Я не могу этого сделать, потому что мне нужно знать: 1) независимо от того, опубликовал ли пользователь данные или нет, и 2) достоверен ли пользователь данных.

Например, когда пользователь сначала отправляется на страницу регистрации, они не размещают никаких данных, поэтому $ _POST ['email'] генерирует предупреждения PHP, потому что их не существует. Вот почему я проверяю, были ли данные отправлены до проверки.

Имеет ли это смысл?

function validate_email($str) { 
    $str = trim(strtolower($str)); 
    if(!filter_var($str, FILTER_VALIDATE_EMAIL)) { 
     return false; 
    } else { 
     return $str; 
    } 
} 

function validate_password($str) { 
    $str = trim($str); 
    if(strlen($str) < 5 || strlen($str) > 70) { 
     return false; 
    } else { 
     return $str; 
    } 
} 

$email = false; 
$password = false; 
$errorMessage = false; 

if(!empty($_POST['email'])) { 
    $email = validate_email($_POST['email']); 
    if($email) { 
     if(!empty($_POST['password'])) { 
      $password = validate_password($_POST['password']); 
      if($password) { 
       createNewUser($email,$password); 
      } else { 
       $errorMessage = "The password is not valid"; 
      } 
     } else { 
      $errorMessage = "The password is not valid"; 
     } 
    } else { 
     $errorMessage = "Email address is invalid"; 
    } 
} else { 
    $errorMessage = "Email address is invalid"; 
} 

if($errorMessage) echo $errorMessage; 
+0

Theres ничего действительно плохого в том, что не может быть аккуратным способом, но это, вероятно, не будет так быстро – Adam

+0

это не нравится скорость любой вопрос с таким кодом. Единственная реальная проблема здесь - читаемость. – Femaref

+0

@AdamTester Код, поддерживаемый, имеет гораздо более высокий приоритет, чем небольшой выигрыш в скорости. Который, вероятно, не будет заметен. – Bart

ответ

4

Вам не нужны empty проверки в этой точке, переместить их в функции проверки.

Например:

function validate_email($str) { 
    if(empty($str)) { 
     return false; 
    } 

    $str = trim(strtolower($str)); 
    if(!filter_var($str, FILTER_VALIDATE_EMAIL)) { 
     return false; 
    } else { 
     return $str; 
    } 
} 

$email = validate_email($_POST['email']); 
if($email) { 
    // your code 
} 
+0

+1 Именно то, что прошло у меня во время чтения кода. Я также не хочу добавлять, что ограничение на длину пароля не очень хорошее. Семьдесят - достаточно высокое число, но пользователям не следует ограничивать доступ к более длинному паролю. – Bart

+0

Ну, на самом деле это не вопрос, поэтому я не касался этого. – Femaref

+1

замечание от меня: первая обрезка, а затем проверить, является ли пустой (предотвращает ввод данных с пробелами) – paranoid

2

Это немного чище:

function validate_email($str) { 
    if (empty($str)) return false; 
    $str = trim(strtolower($str)); 
    if(!filter_var($str, FILTER_VALIDATE_EMAIL)) { 
     return false; 
    } else { 
     return $str; 
    } 
} 

function validate_password($str) { 
    if (empty($str)) return false; 
    $str = trim($str); 
    if(strlen($str) < 5 || strlen($str) > 70) { 
     return false; 
    } else { 
     return $str; 
    } 
} 

$email = false; 
$password = false; 
$errorMessage = false; 

$email = validate_email($_POST['email']); 
if($email) { 
    $password = validate_password($_POST['password']); 
    if($password) { 
     createNewUser($email,$password); 
    } else { 
     $errorMessage = "The password is not valid"; 
    } 
} else { 
    $errorMessage = "Email address is invalid"; 
} 

if($errorMessage) echo $errorMessage; 
4

Всякий раз, когда у вас есть вложенные if() s вы можете перевернуть логику "наизнанку":

if (A) 
    if (B) 
    if (C) 
     final() 

изменить на:

if (!A) return 
if (!B) return 
if (!C) return 
final() 

В вашем случае вместо возврата вы можете исключить исключение.

try { 
    validateAndCreateNewUser(); 
} 
catch(ValidationError $e) { 
    display($e->getMessage()); 
} 
+1

Как правило, плохая идея использовать исключения для управления нормальным потоком. Однако я согласен с первым пунктом; аргумент «единственного выхода», по-видимому, слепо придерживается (некоторыми) без уважительной причины. – cmbuckley

+0

@cbuckley, что является исключительным, является делом на углах. В этом случае управление потоком простое, и шаблон не вызывает удивления ('ValidationException' находится в [.Net] (http://msdn.microsoft.com/en-us/library/system.windows.controls.validationerror.aspx), [Django] (https://docs.djangoproject.com/en/dev/ref/exceptions/), [JavaX] (http://docs.oracle.com/javaee/6/api/javax /validation/ValidationException.html), Grails ... и т.д.) – Kornel