【问题标题】:PHP Variable Randomly ChangesPHP 变量随机变化
【发布时间】:2013-09-01 06:02:53
【问题描述】:

我在一些 PHP 代码中遇到了一个非常奇怪且令人担忧的问题。我在 IF 语句中返回 true 的变量显然应该返回 false。

$pr = $_SESSION['fin_print_printer']; //this should equal 0     
print $pr; //this returns 0, as it should
if($pr == "L"){
   print "local";
} else {
       print "serve";
} 
print $pr; //this returns 0 again, as it should

这会在我的脚本中打印“本地”(在两个零之间)并且不打印“服务”。我的项目中有超过 100,000 行代码,我还没有遇到过这个问题,现在我不知道发生了什么。

如果我这样做 if($pr === "L"),那么它会按预期工作,但上面没有。

【问题讨论】:

  • 显示一个示例输出,如果$pr IS 0 如您所说,0 到 == "L" 在逻辑上是不可能的
  • 使用三等号 if ($pr === "L")
  • ===== 在这种情况下应该无关紧要
  • 作为最后的手段,我在这里找到的 CStatementTracer 可能会有所帮助:stackoverflow.com/questions/10574614/…
  • $pr 是一个整数变量。如果与== 比较,PHP 将尝试将“L”转换为整数,得到一个值 0,它等于$pr 的值。如果您与=== 进行比较,则测试将失败,因为类型不同。

标签: php variables if-statement


【解决方案1】:

PHP 正在尝试将 'L' 类型转换为 int,结果为 0。

intval('L'); // 0

将您的代码更改为以下内容,以便将类型考虑在内:

if($pr === "L")
{
    print "local";
} 
else 
{
    print "serve";
} 

或者手动将$pr 类型转换为字符串。

// You can also to (string)$pr ("0" instead of 0)
if(strval($pr) == "L")
{
    print "local";
} 
else 
{
    print "serve";
} 

【讨论】:

  • 谢谢!正如另一位用户评论的那样,L 等于 0 在逻辑上是不可能的,这就是为什么我觉得这令人难以置信。但是谢谢你的帮助。使用 strval() 效果很好(正如预期的那样使用 ===)。
  • @KyleLawrence 您也可以使用(string)$pr 对其进行类型转换。就像一个附加说明。关于 L 为 0,这只是 PHP 解释器试图将 L 与整数进行比较,因为 $pr 在 int 中。
【解决方案2】:

也许如果你使用类型转换(我没有检查它):

if ( (string)$pr == "L" ) {
   print "local";
} else {
       print "serve";
}

【讨论】:

  • 它有效。 3v4l.org/G6Rg5 虽然我可能会说,使用=== 会更容易。
【解决方案3】:

鲜为人知的方法:您也可以像这样进行强制转换

if ("L" == $pr) {

由于比较松散,PHP 将右值转换为左值的类型,正如您已经知道的那样,string(1)"L" 被转换为 int(0)int(0) 被转换为 string(1)"0"

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2013-05-09
    • 2022-01-23
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多