2013-11-28 2 views
-2

Я путать с сильфона кодом:Не оператор с несколькими или оператором

Кулак код, который не работает:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 
{ 
    redirect('dashboard.php'); 
} 

Второй код, который работает:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

Что такое различие между обоими кодами?

+0

В первой части оба условия возвращают false, во второй части оба возвращают false и! (False) становится равным true. –

+3

Разве они не учат [Закон Моргана] (http://en.wikipedia.org/wiki/De_Morgan's_laws) в школе? – Barmar

ответ

2

Я знаю, что у вас уже есть шесть ответов на ваш вопрос, но ни один из них не использует простой английский, поэтому я сделаю попытку самостоятельно Что ж.

Давайте посмотрим на этот код шаг за шагом, разделив его на более мелкие части и точно объясним каждый шаг.


код, который не работает

Сначала у вас есть эта строка:

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 

Вместо того, чтобы смотреть на полный, если статьи уже, давайте разделим его на две части:

  1. if ($_SESSION['userType'] != 'A')
  2. if ($_SESSION['userType'] != 'S')

Первая часть будет вызывать в любое время, что является $_SESSION['userType'] любое значение, отличное A.

Вторая часть будет запускаться в любое время, когда $_SESSION['userType'] - любое значение, отличное от S.

Теперь вы присоединились к ним вместе с оператором «или», так что достаточно, чтобы один из них был истинным для предложения if для запуска. Посмотрим, что произойдет, когда мы попробуем это.

  1. Мы установили $_SESSION['userType'] в 'B' и идти в, если п. Первое, что происходит, - это то, что PHP смотрит на первую часть, if ($_SESSION['userType'] != 'A') и находит, что 'B' != 'A'. Ему не нужно переходить ко второй части, потому что она уже обнаружила, что одна из частей оператора if истинна, и поэтому она решает, что полный оператор if также должен быть правдой.

  2. Мы установили $_SESSION['userType'] в 'A' и перешли в предложение if. Первое, что происходит, - это то, что PHP смотрит на первую часть, if ($_SESSION['userType'] != 'A') и находит, что 'A' == 'A', поэтому первая часть является ложной. Затем он переходит ко второй части, которая составляет if ($_SESSION['userType'] != 'S'), и находит, что 'A' != 'S'. Поскольку это означает, что одна из частей оператора if истинна, она снова решает, что полный оператор if также должен быть правдой.

Теперь обратите внимание на это. Даже если вы отправляете 'A' в предложение if, он все равно будет запускаться из-за второй части. И если вы должны были отправить 'S', он будет вызываться из-за первой части. По сути, полная инструкция first if будет срабатывать независимо от того, для чего установлено значение $_SESSION['userType']. Это тавтология - это всегда так.


Код, который работает

Это ваше полное, если заявление:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))

Давайте игнорировать ! сейчас, и разделить его на две части or оператор.

  1. if ($_SESSION['userType'] == 'A')
  2. if ($_SESSION['userType'] == 'S')

Обратите внимание, что это логическая противоположность кода вы должны были это не сработало. Первая строка означает «принимать только 'A'», а вторая означает «принимать только 'S'». Таким образом, этот код вызывает только только, если вы дадите его либо 'A', либо 'S'.

Теперь, что произойдет, если вы положите ! перед всем, как и вы?

Оператор ! просто отменяет все, что он поставлен перед. Таким образом, это изменяет значение от «либо A, либо S« до »ни A, ни S».


Резюме

Ваш первый пример сводится к "любое значение вообще".

Ваш второй пример сводится к «любому значению, но не A, а также не S».

Если вы хотите узнать больше о базовой логике, я предлагаю посмотреть на De Morgan's laws, так как вы были связаны с приведенным выше комментарием. Это даст вам представление о том, как and и or подходят друг к другу.

0
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') { 

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

if (!($_SESSION['userType'] == 'A' && $_SESSION['userType'] == 'S')) { 
+0

Итак? ........... –

+0

Так вот в чем разница. –

+0

О, вы имеете в виду '||' и '&&'? Вы могли бы рассказать об этом. –

-1

первый код, который не работает

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') 
{ 
    redirect('dashboard.php'); 
} 

позволяет simplyfy его как под:

if (true || true) //the condition will be true or vice versa 
{ 
    redirect('dashboard.php'); 
} 

Второй код, который рабочий:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

и упрощенная версия:

if (!(true || true)) same as if (!(true)) //i.e. false or vice versa 
{ 
    redirect('dashboard.php'); 
} 

поэтому в основном один истинно, а другое ложно, или наоборот, так вот почему они действуют diffrenetly.

+0

причина для downvote? –

+0

Вы ничего не объясняете. –

+0

@RobertHarvey Я думаю, что приведенный выше пример полностью исключает все. Еще раз посмотрим –

1

Не ... совершенно.

Если я правильно помню логическую логику, ошибка лежит в порядке операций.

if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') { 

если UserType равен А, это не будет работать ... так как первая операция, чтобы проверить, что она не равна А и ОШ оставляют право ... так что, если первый не так, все утверждение ложно.

Вашего второй подход приводит к:

if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S')) 
{ 
    redirect('dashboard.php'); 
} 

ЕСЛИ НЕ UserType равно А, или UserType равна S, поэтому он работает, как вы хотите его.

Попробуйте

if ($_SESSION['userType'] != 'A' && $_SESSION['userType'] != 'S')) { 

что означает, если UserType не А и UserType не S

Я думаю, что даст вам то, что вы, вероятно, ищете. IE Выполняйте только то, что находится в цикле, если userType не является ни A, ни S.

+0

Во второй фразе нет '&&'. –

+0

Извините ... Поздно здесь :) вторая фраза была направлена ​​на первый ответ, а не его собственное представление. Обновление, чтобы отразить это, и включить его вторую фразу. –

+0

Не беспокойтесь о ответах других людей. Просто назовите свой ответ на вопрос. –

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