2014-11-08 4 views
-2

У меня есть класс формы php, предназначенный для проверки ввода формы. Однако при выполнении функции isEmailEmpty() я столкнулся с неожиданным поведением. Вот мой код:Функция php bool возвращает строку вместо bool

class Form { 
var $userEmail; 
var $userPassword; 
var $hashedPassword; 
var $requiredPassLength = 6; 

public function __construct($userEmail, $userPassword) { 
    $this->userEmail = $this->cleanInput($userEmail); 
    $this->userPassword = $this->cleanInput($userPassword); 
} 

public function cleanInput($dataField) { 
    $dataField = trim($dataField); 
    $dataField = stripslashes($dataField); 
    $dataField = htmlspecialchars($dataField); 
    return $dataField; 
} 

public function isEmailEmpty() { 
    return ($this->userEmail == "" || $this->userEmail == null) ? true : false; 
} 

public function isPasswordEmpty() { 
    return ($this->userPassword == "" || $this->userPassword == null) ? true : false; 
} 

public function isEmailValid() { 
    return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL); 
} 

public function isPasswordValid() { 
    return (strlen($this->userPassword) >= $this->requiredPassLength) ? true : false; 
} 

public function hashPassword() { 
    return $this->hashedPassword = password_hash($this->userPassword, PASSWORD_BCRYPT); 
} 
// More functions down here... 

Теперь, позволяет сказать, что я экземпляр объекта следующим образом:

$userEmail = "[email protected]"; 
$userPassword = "rootatoot"; 
$form = new Form($userEmail, $userPassword); 

Поскольку моя isEmailValid() функция возвращает логическое значение, я ожидаю получить логическое возвращение значение, т. е. true/false или 1/0 после исключения. Однако это не так. Вместо этого, когда выражение оценивается как true, я получаю строковый вывод проверенного значения электронной почты. Например, с учетом объекта, описанного выше, оператор echo $form->isEmailValid() выдает [email protected]. Запуск gettype($form->isEmailValid) возвращает string, чего и не ожидалось. Что еще более любопытно: функция isPasswordValid() НЕ ведет себя так. Запуск $form->isPasswordValid() возвращает 1, если пароль действительно действителен. Запуск gettype($form->isPasswordValid()) возвращает boolean, как и ожидалось. Интересно также, что мой код по-прежнему работает так, как ожидалось. Например, блок

if ($form->isEmailValid()) { 
     echo "Valid email"; 
} else { 
     echo "Invalid email"; 
} 

всегда дает правильный выход. Несмотря на то, что мой код работает так, как ожидалось, все равно важно понять, что происходит за кулисами и почему. Итак, мои вопросы относительно этого поведения:

  1. Что несет ответственность за функцию bool, возвращающую строку? Например, было ли это по дизайну или побочным продуктом какого-то другого процесса?
  2. Существуют ли сценарии, в которых это неожиданное возвращаемое значение может вызвать проблему? Или система понимает эту оценку и всегда обрабатывает ее соответственно? Теперь мой код работает отлично, но я не думаю, что его надуманный, чтобы ожидать неожиданных возвратных значений, вызывающих некоторые проблемы раньше или позже.

Я ценю любую информацию, которую вы можете предоставить. Благодаря!

+1

'filter_var' возвращает логическое значение false, если фильтр не работает; в противном случае он возвращает отфильтрованные данные - http://php.net/manual/en/function.filter-var.php – andrewsi

ответ

1

Поскольку моя функция isEmailValid() возвращает логическое значение

Ну, нет, это не.

От the documentation of filter_var:

Возвращает отфильтрованные данные или FALSE, если фильтр не удается.

Ваша if логика еще работал, потому что не-пустая строка «truthy», что означает it will be treated the same as truewhen used as a condition.

Для того, чтобы иметь isEmailValidфактически возвращают логическое значение, вы можете изменить свой код на этот:

public function isEmailValid() 
{ 
    return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL) !== FALSE; 
} 
+0

Я вижу. Если я выполняю функцию с недопустимым вводом электронной почты, ничего не выводится. Даже «ЛОЖЬ». Не выводит ли результат автоматически значение false? – wheresmyspaceship

+1

@wheresmyspaceship Когда 'false' преобразуется в строку с помощью' echo', она становится пустой строкой. Используйте 'var_dump()', если вы хотите видеть слова 'true' или' false'. – Barmar

+0

Большое спасибо @Barmar! – wheresmyspaceship

0

filter_var не возвращает логическое значение, она возвращает значение, если это действительно, в противном случае она возвращает false.Таким образом, вы можете переписать функцию:

public function isEmailValid() { 
    return !!filter_var($this->userEmail, FILTER_VALIDATE_EMAIL); 
} 

Использование ! дважды преобразует значение в логическое значение.

Или, как ваши другие функции, вы можете написать:

public function isEmailValid() { 
    return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL) ? true : false; 
} 

Вам не нужен условный оператор в других функциях, поскольку они используют оператор, делают возврат булевыми, например, вы могли бы написать:

public function isEmailEmpty() { 
    return ($this->userEmail == "" || $this->userEmail == null); 
} 

Чтобы ответить на ваш второй вопрос, это не должно быть проблемой, если вы всегда использовать функцию в логических контекстах, таких как if(). Никакое действующее письмо не должно быть ложным.

+0

Я уже сказал это. –

+0

Мы оба отправляли сообщения одновременно. – Barmar

+0

Спасибо @Barmar! Я тоже хотел бы принять ваш ответ, но @Lightness Races на Орбите быстрее заработал. – wheresmyspaceship

Смежные вопросы