我对以下代码感到困惑:
无效的拳头代码:
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
{
redirect('dashboard.php');
}
正在运行的第二个代码:
if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
{
redirect('dashboard.php');
}
两个代码之间有什么区别?
答案 0 :(得分:2)
我知道你的问题已经有六个答案,但是没有一个使用普通英语,所以我也会自己尝试。
让我们一步一步地看一下这段代码,把它分成更小的部分,并准确地解释每一步。
无效的代码
首先你有这一行:
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
不要再查看完整的if子句,而是将其分为两部分:
if ($_SESSION['userType'] != 'A')
if ($_SESSION['userType'] != 'S')
第一部分将触发$_SESSION['userType']
除A
以外的任何值的任何时间。
第二部分将触发$_SESSION['userType']
除S
以外的任何值的任何时间。
现在,您已经将它们与“or”运算符一起加入它们,因此只要触发if子句,其中一个就足够了。让我们看看当我们尝试时会发生什么。
我们将$_SESSION['userType']
设置为'B'
并进入if子句。首先发生的是PHP查看第一部分if ($_SESSION['userType'] != 'A')
,并找到'B' != 'A'
。它不需要转到第二部分,因为它已经发现if语句的一部分是真的,因此它确定完整的if语句也必须为真。
我们将$_SESSION['userType']
设置为'A'
并进入if子句。首先发生的是PHP查看第一部分if ($_SESSION['userType'] != 'A')
,并找到'A' == 'A'
,因此第一部分是false。然后继续进行第二部分if ($_SESSION['userType'] != 'S')
,找到'A' != 'S'
。因为这意味着if语句的一个部分为true,所以它再次确定完整的if语句也必须为true。
现在注意这意味着什么。即使您向if子句发送'A'
,它仍会因第二部分而触发。如果您要发送'S'
,则会因为第一部分而触发。基本上,无论$_SESSION['userType']
设置为什么,都会触发完整的第一个if语句。这是一个重言式 - 它总是如此。
正在运行的代码
这是你的完整if语句:
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
如何结合在一起。
答案 1 :(得分:1)
...不相当。
如果我正确记住布尔逻辑,则错误在于操作顺序。
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') {
如果userType等于A,这将不起作用...因为第一个操作是检查它不等于A而OR是从左到右...所以如果第一个不是真的,那么整个语句是假的。
您的第二种方法转换为:
if (!($_SESSION['userType'] == 'A' || $_SESSION['userType'] == 'S'))
{
redirect('dashboard.php');
}
如果不是userType等于A OR userType等于S,这就是它按你的意愿工作的原因。
尝试
if ($_SESSION['userType'] != 'A' && $_SESSION['userType'] != 'S')) {
表示IF userType不是A而userType不是S
我认为这会给你你想要的东西。 IE如果userType既不是A,也不是S,只执行循环中的操作。
答案 2 :(得分:0)
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S') {
或多或少等同于
if (!($_SESSION['userType'] == 'A' && $_SESSION['userType'] == 'S')) {
答案 3 :(得分:-1)
第一个无效的代码
if ($_SESSION['userType'] != 'A' || $_SESSION['userType'] != 'S')
{
redirect('dashboard.php');
}
让我们简单地把它当作:
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');
}
所以基本上一个是真的,另一个是假的,反之亦然,这就是为什么他们的行为是差异的。