【问题标题】:Are this if statements equal? [closed]这是 if 语句相等吗? [关闭]
【发布时间】:2015-07-19 19:54:15
【问题描述】:

我遇到了一个php语句并在想,是

if(isset($_SESSION['id'])==1){

}

非常相似

if (isset($_SESSION['id']) && $_SESSION['id']==1){

}

【问题讨论】:

  • 你的问题是……?
  • 你有,var_dump(); 最能调试 php,用它和die; 一步步来看看,返回的东西是什么,你就能自己弄清楚了
  • isset() 如果 var 存在并且值不是 NULL,则返回 TRUE,如果 $_SESSION['id'] 存在并且值不是 NULL,isset( $_SESSION['id'] ) == 1 将始终为 TRUE。
  • 是什么让你认为他们是平等的。即使您清楚地查看代码,它们也不相等,

标签: php if-statement


【解决方案1】:

让我们分解一下。

isset($_SESSION['id']) == 1

第一部分,isset() 调用,将返回一个布尔值(truefalse),具体取决于是否设置了会话 ID。

当您将整数值与布尔值进行比较时,使用 == 运算符,整数将被强制转换(或 cast/type-juggled)布尔值。因此,如果整数是一个“真实”值,即大于或等于 1,那么它将变成true。如果小于等于 0 则转为false

换句话说,如果会话已设置,则表达式将转换为true === true(其计算结果为true)。如果未设置,则将其转换为false === true(计算结果为false)。

因此,总而言之,它可能不会像您认为的那样做。使用后一个 if 语句。

【讨论】:

  • 其实根据the manual,当你用==比较一个布尔值(左边)和一个整数时,整数值被强制转换为布尔值,而不是相反。您可以通过将 true 与 2(或任何其他非零值)而不是 1 进行比较来测试这一点。它们仍然会比较相等,因为所有非零整数值都转换为 true..
  • @TedHopp 你是对的。我弄错了。修复。谢谢你抓住它:)
【解决方案2】:

这些语句不等价。因为isset() 返回TRUEFALSE,所以第一个测试:

if(isset($_SESSION['id'])==1){

}

完全等同于:

if(isset($_SESSION['id'])){

}

因为 php 将 1 转换为布尔值 TRUE,所以 == 运算符具有兼容的类型。另一方面,第二个不仅测试是否设置了$_SESSION['id'],如果设置了,还要测试值是否设置为1(在类型杂耍解决比较字符串与整数之后)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2014-12-15
    • 2021-08-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多