У меня есть класс 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";
}
всегда дает правильный вывод. Несмотря на то, что мой код работает должным образом, все равно важно понимать, что происходит за кулисами и почему. Итак, мои вопросы относительно этого поведения:
Я ценю любую информацию, которую вы можете предоставить. Спасибо!
Так как моя функция isEmailValid () возвращает bool
Что ж, нет не.
Возвращает отфильтрованные данные или
FALSE
если фильтр не работает.
Ваш if
логика все еще работала, потому что непустая строка является «правдивой», что означает это будет рассматриваться так же, как true
когда используется как условие.
Чтобы иметь isEmailValid
на самом деле верните логическое значение, вы можете изменить свой код на это:
public function isEmailValid()
{
return filter_var($this->userEmail, FILTER_VALIDATE_EMAIL) !== FALSE;
}
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()
, Ни один действительный адрес электронной почты не должен быть ложным.