【问题标题】:php is there a bug in assigning value to variable inside if condition? [closed]php 在 if 条件下为变量赋值是否存在错误? [关闭]
【发布时间】:2013-12-05 13:59:08
【问题描述】:

请看这段代码:

function getVar(){
    return "some string";
}

function test1(){
    if($a = getVar()){
        echo $a;
    }
}

function test2(){
    if($a = getVar() && $b = getVar()){
        echo $a;
    }
}

//test1();
test2();

我想你会明白发生了什么。试试test1()test2()

为什么test2() 变成$a 1

【问题讨论】:

  • if 条件下,您应该使用== 来检查是否相等。 = 用于分配。
  • if 语句返回真或假。这可能就是返回的内容。
  • 哦,是的,分配的优先级低于&&,atm 太困了。尽管 OP 应该将代码添加到问题中,但这个问题并不算太糟糕,值得多次否决。
  • @jeff: if 语句不返回任何内容。
  • @Mark 我同意 100%,但我故意使用“返回”一词而不是评估,因为提供的代码更有意义。

标签: php if-statement variable-assignment


【解决方案1】:

基本上,代码执行以下操作:if ($a = (getVar() && $b=getVar()))。这没有错误。 "some string" && "some string" == true

您可以了解the operator precedence in PHP in the doc

【讨论】:

【解决方案2】:

它本质上是这样运行的:

<?php

function getVar(){
    return "some string";
}

function test1(){
    if($a = getVar()){
        echo $a;
    }
}

function test2(){
    if($a = (getVar() && $b=getVar())){
        echo $a;
    }
}

//test1();
test2();


?>

注意我添加的额外括号。

getVar() 返回一个真实值。当它在布尔值的上下文中求值时(通过&amp;&amp;),它被转换为布尔值,所以整个表达式返回trueecho 只是出于某种原因将其显示为1,但您可以通过var_dump 来查看其类型。

【讨论】:

  • 没有得到。有什么办法可以使这项工作。如果在 test2 中,我需要在里面获得赋值 $a 和 $b
  • 如果您希望$a$b 都具有"some string" 的值,则移动括号以适当地包裹它们; if(($a=getVar() &amp;&amp; ($b=getVar()))。但是在 if 语句中分配变量是一种不好的形式。
  • 括号太多.. 我什至没有做对。 if(($a=getVar()) &amp;&amp; ($b=getVar()))(但同样,我不推荐它!!)
【解决方案3】:

在 test2() 中,

$a = (getVar() && $b = getVar()) 

getvar() ,返回一个字符串,因此它被分配给 $b ,然后它被归结为 ,

$a = (getVar() && $b)

   then get var() return a string so it has a value,

然后$a = (some value &amp;&amp; $b)

那么 && 做的是,它检查布尔值,双方都有布尔值 true ,所以它返回布尔值 true 并分配给 $a。这意味着 $b 有 1。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 2013-07-14
    • 2011-02-15
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2013-11-15
    相关资源
    最近更新 更多