Я знаю, что у вас уже есть шесть ответов на ваш вопрос, но ни один из них не использует простой английский, поэтому я сделаю попытку самостоятельно Что ж.
Давайте посмотрим на этот код шаг за шагом, разделив его на более мелкие части и точно объясним каждый шаг.
код, который не работает
Сначала у вас есть эта строка:
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
Вместо того, чтобы смотреть на полный, если статьи уже, давайте разделим его на две части:
if ($_SESSION['userType'] != 'A')
if ($_SESSION['userType'] != 'S')
Первая часть будет вызывать в любое время, что является $_SESSION['userType']
любое значение, отличное A
.
Вторая часть будет запускаться в любое время, когда $_SESSION['userType']
- любое значение, отличное от S
.
Теперь вы присоединились к ним вместе с оператором «или», так что достаточно, чтобы один из них был истинным для предложения if для запуска. Посмотрим, что произойдет, когда мы попробуем это.
Мы установили $_SESSION['userType']
в 'B'
и идти в, если п. Первое, что происходит, - это то, что PHP смотрит на первую часть, if ($_SESSION['userType'] != 'A')
и находит, что 'B' != 'A'
. Ему не нужно переходить ко второй части, потому что она уже обнаружила, что одна из частей оператора if истинна, и поэтому она решает, что полный оператор if также должен быть правдой.
Мы установили $_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
оператор.
if ($_SESSION['userType'] == 'A')
if ($_SESSION['userType'] == 'S')
Обратите внимание, что это логическая противоположность кода вы должны были это не сработало. Первая строка означает «принимать только 'A'
», а вторая означает «принимать только 'S'
». Таким образом, этот код вызывает только только, если вы дадите его либо 'A'
, либо 'S'
.
Теперь, что произойдет, если вы положите !
перед всем, как и вы?
Оператор !
просто отменяет все, что он поставлен перед. Таким образом, это изменяет значение от «либо A
, либо S
« до »ни A
, ни S
».
Резюме
Ваш первый пример сводится к "любое значение вообще".
Ваш второй пример сводится к «любому значению, но не A
, а также не S
».
Если вы хотите узнать больше о базовой логике, я предлагаю посмотреть на De Morgan's laws, так как вы были связаны с приведенным выше комментарием. Это даст вам представление о том, как and
и or
подходят друг к другу.
В первой части оба условия возвращают false, во второй части оба возвращают false и! (False) становится равным true. –
Разве они не учат [Закон Моргана] (http://en.wikipedia.org/wiki/De_Morgan's_laws) в школе? – Barmar