Быстрый пример оценки оператора:
function returnFalse() { echo "returning false\n"; return false; }
function returnTrue() { echo "returning true\n"; return true; }
echo "false && true\n";
if (returnFalse() && returnTrue()) {
echo "True!\n";
} else {
echo "False!\n";
}
echo "\ntrue && false\n";
if (returnTrue() && returnFalse()) {
echo "True!\n";
} else {
echo "False!\n";
}
echo "\ntrue && true\n";
if (returnTrue() && returnTrue()) {
echo "True!\n";
} else {
echo "False!\n";
}
Этот эксперимент показывает, что оператор &&
может замкнуть накоротко только в том случае, если первый операнд имеет значение false. Давайте посмотрим, где код не работает.
if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {
header ("Location: login.php");
} else {
include('head3.php');
}
Условие, на словах, таково: если $_SESSION['login']
не существует и $_SESSION['login']
не является пустой строкой. Мы никогда не сможем получить доступ к ключу, который не существует в массиве $_SESSION
, и мы знаем, что оператор &&
будет замыкать накоротко, только если его левый операнд имеет значение false.
Левый операнд $_SESSION['login']
не существует. Это верно, если $_SESSION['login']
не существует, то есть оператор &&
должен смотреть на правый операнд, чтобы убедиться, что он также равен true. Теперь &&
смотрит на условие $_SESSION['login']
- не пустая строка. Упс! Доступ к этому условию $_SESSION['login']
, который мы уже определили на данный момент, не существует!