Функция php bool возвращает строку вместо bool

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

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. Существуют ли сценарии, в которых это неожиданное возвращаемое значение может вызвать проблемы? Или система понимает эту оценку и всегда обрабатывает ее соответственно? Мой код теперь работает нормально, но я не думаю, что он надуман, чтобы предвидеть неожиданные возвращаемые значения, вызывающие некоторые проблемы рано или поздно.

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

-2

Решение

Так как моя функция isEmailValid () возвращает bool

Что ж, нет не.

От документация filter_var:

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

Ваш if логика все еще работала, потому что непустая строка является «правдивой», что означает это будет рассматриваться так же, как true когда используется как условие.

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

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

Другие решения

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

По вопросам рекламы [email protected]