2014-02-02 2 views
0

В чем разница междуИсеть() несколько параметров

if (!isset($_SESSION['lang']) && !isset($_GET['lang'])) return 'ru'; 

и

if (!isset($_SESSION['lang'], $_GET['lang'])) return 'ru'; 

Почему первая одна работа правильно, но вторая всегда возвращаются «ру»? Как я понимаю, оба условия эквивалентны, но почему они работают по-разному в тех же условиях?

Без сеанса и получения параметра первая версия ничего не возвращает (поскольку она мне нужна), но вторая версия всегда возвращает значение true, независимо от того, установлены ли какие-либо параметры или нет.

+0

Есть ли '$ _SESSION ['lang']' и '$ _GET ['lang']' задано перед if? – Reger

ответ

2

Первое условие означает, что оба они должны быть установлены

if (! isset($_SESSION['lang']) && ! isset($_GET['lang'])) 

Второе условие:

isset($_SESSION['lang'], $_GET['lang'] означает: both are set.

!(isset($_SESSION['lang'], $_GET['lang']) означает: at least one is unset

Так что, если $_SESSION['lang'] установлен и $_GET['lang'] не установлен, то второе условие будет отображаться ru

+0

Ницца, спасибо! – kxc

0

Вы используете неправильное состояние. Вы можете использовать любое из этих 3 условий.

if ((!isset($i)) || (!isset($j))) echo 'ru1'; 
if (!(isset($i) && isset($j))) echo 'ru3'; 
if (!isset($i,$j)) echo 'ru2'; 
1

При наличии нескольких параметров поставляются затем isset() возвратит TRUE только , если все параметры установлены. Оценка идет слева направо и останавливается, как только встречается неустановленная переменная.

Это означает, что isset(A,B) - это то же самое, что и isset(A) && isset(B).

Поэтому ваша вторая версия

!isset(A,B) 

эквивалентно

!(isset(A) && isset(B)) 

что эквивалентно

!isset(A) || !isset(B) // DeMorgan 

, который НЕ эквивалент вашей первой версии

!isset(A) && !isset(B) 
+0

Ohh .. Большое спасибо, я понял. – kxc

+0

Так что нет способа, чтобы не дублировать слово «isset»? И если я хочу что-то сделать, только когда у меня нет двух или трех или четырех переменных, мне нужно написать только что-то вроде '! Isset (A) &&! Isset (B) &&! Isset (C) &&! Isset (D) ' – kxc

+0

Да, точно .... – EricSchaefer

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