2013-11-21 17 views
-5

请看看这个代码:PHP是否有一个错误,如果条件内赋值给变量?

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()制作$a1

+0

在'if'条件下,您应该使用'=='检查是否相等。 '='用于分配。 – cmbuckley

+0

如果语句返回true或false。这可能是正在返回的内容。 – jeff

+2

哦,是的赋值的优先级低于'&&',有点困倦atm。这个问题不是很糟糕,不值得许多赞扬,尽管OP应该将代码添加到问题中。 –

回答

6

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

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

+0

http://www.php.net/manual/en/language.operators.precedence.php – sectus

+0

如果您添加了如何更正代码,会更好。我只需要将括号中的赋值赋值给变量$ a和$ b。 – Jamol

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()返回真值。当它在布尔值的上下文中进行评估时(通过&&)它被转换为布尔值,所以整个表达式返回trueecho只是显示为1出于任何原因,但您可以var_dump而不是看它的类型。

+0

没有得到。有什么办法可以使这项工作。如果在test2中需要分配值$ a和$ b – Jamol

+2

如果你希望'$ a'和'$ b'的值为''一些字符串'​​''然后移动括号来适当地包装它们; 'if(($ a = getVar()&&($ b = getVar()))'。但是在if语句中分配变量是一种糟糕的形式 – mpen

+0

括号过多..我甚至没有这样做。如果(($ a = getVar())&&($ b = getVar()))'(但是,我不推荐它!!) – mpen

0

在test2的(),

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

getvar()返回一个字符串,它赋予$ b,则它的redued于

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

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

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

那么什么& &做的是,它检查booleon的值,两边都有boolean true,所以它返回布尔值true并赋值给$ a。这意味着$ b有1.