Я читаю PHP Cookbook, в разделе "Формы" есть следующее:
Проблема: вы хотите удостовериться, что значение было предоставлено для элемента формы. Например, вы хотите убедиться, что текстовое поле не осталось пустым.
Затем автор уточняет:
// Making sure $_POST['flavor'] exists before checking its length
if (! (filter_has_var(INPUT_POST, 'flavor') &&
(strlen(filter_input(INPUT_POST, 'flavor')) > 0))) {
print 'You must enter your favorite ice cream flavor.';
}
Я не понимаю, как это выражение "и" оценивается как true.
Не будет !(filter_has_var(INPUT_POST,'flavor')
всегда будет ложным?
filter_has_var(INPUT_POST, 'flavor')
будет убедиться, что форма отправлен flavor
переменного поста
strlen(filter_input(INPUT_POST, 'flavor')) > 0
будет убедиться, что flavor
переменной пост является иным, чем ""
(пустая строка)
!
оператор применяется ко всему выражению, используя ()
и будет удостовериться, что оба этих условия ложны, чтобы они были истинными.
Ключ - это порядок скобок. Проверьте значки карата, которые я поставил под соответствующими скобками:
( !(filter_has_var(INPUT_POST,'flavor') && (strlen(filter_input(INPUT_POST,'flavor'))>0)) )
^ ^
Поэтому он фактически проверяет: "if not both are true"
.
Вы можете переписать это так: "if X is not true or Y is not true"
:
( !filter_has_var(INPUT_POST,'flavor') || !strlen(filter_input(INPUT_POST,'flavor')) > 0 )
По-моему, эта последняя версия более читаема, и поэтому я бы предпочел ее.
!
Оператор применяется ко всему(... && ...)
выражению. Который фактически отрицает это: «если он не существует или является пустой строкой»