表达式中的变量赋值如何工作?

时间:2011-08-27 14:56:13

标签: php variables expression variable-assignment

这是我以前见过的一种做法,但不常见:在评估值本身的同时将变量赋值给一个值(或者是表达式本身被评估?)。例如:

// Outputs "The value is 1"
$value = 1;
if ($var = $value) {
    echo "The value is $var";
}

似乎与:

相同
$value = 1;
$var = $value;
if ($var) {
    echo "The value is $var";
}

另一个例子:

// Outputs "The value is 1"
$value = 1;
echo "The value is ".$var = $value;

我一直在使用它来缩短我的代码,主要是第一个例子:用于评估第一个变量或表达式,同时将它分配给同一表达式中的另一个。像这样:

if ($status = User::save($data)) {
    echo "User saved.";
}
// do something else with $status

这看起来很基本,但我实际上找不到任何documentation,也许我不确定在哪里看。我最近才知道它在看了多年之后是如何工作的,我真的很喜欢使用它,但我不想随意使用它。

它使代码更短,对某些人来说可能不那么清楚,但肯定不那么重复。这种方法有什么警告吗?这是完全安全还是有任何可能导致失败或导致意外行为的情况?这似乎不是一种非常普遍的做法,所以我希望在开始“疯狂”之前找到解释。如果记录 ,将非常感谢指向正确页面的链接。

4 个答案:

答案 0 :(得分:3)

来自http://uk3.php.net/manual/en/language.expressions.php

  

PHP以更多其他语言的方式进一步表达表达式。 PHP是一种面向表达式的语言,在某种意义上说几乎所有东西都是表达式。考虑一下我们已经处理过的例子$a = 5。很容易看出这里涉及两个值,整数常量5的值,以及更新为5的$a的值。但事实是,这里涉及一个额外的价值,这就是赋值本身的价值。赋值本身评估为赋值,在本例中为5.实际上,它意味着$a = 5,无论它做什么,都是一个值为5的表达式。因此,写$b = ($a = 5)之类的东西就像写$a = 5; $b = 5;(分号标志着一个陈述的结尾)。由于分配是按从右到左的顺序解析的,因此您也可以编写$b = $a = 5

很多人会争辩说你不应该经常使用这种行为。例如,区分:

if ($a == 5) { ... }

if ($a = 5) { ... }

很棘手!以上两种常用的惯用方式来区分它们:

if (5 == $a) { ... }
if (($a = 5)) { ... }

第一个称为yoda condition,如果省略了等号,则会导致语法错误。后者在运行时不会有任何不同的行为,但是当表达式没有额外的括号时,一些代码检查器会输出警告。

答案 1 :(得分:2)

http://php.net/manual/en/language.operators.precedence.php是您可能需要的。

依次从最高优先级到较低优先级依次评估PHP表达式 所以,首先我们评估赋值,然后对其应用条件语句。还涉及一些type juggling魔法,用于将返回值转换为动态布尔值

  

这种方法有什么警告吗?

不确定。如果零是有效的返回值,则您的代码可能会失败。一个常见的例子是strpos()函数:

if ($pos = strpos("a","aaa"))...

答案 2 :(得分:1)

分配的结果是右手表达的结果,因此$var = $value评估为$value。现在,您必须考虑PHP中的FALSETRUE的确切含义。

来自documentation

FALSE:
 the boolean FALSE itself 
 the integer 0 (zero) 
 the float 0.0 (zero) 
 the empty string, and the string "0" 
 an array with zero elements 
 an object with zero member variables (PHP 4 only) 
 the special type NULL (including unset variables) 
 SimpleXML objects created from empty tags

TRUE:
  everything not listed above

如果作业评估为TRUE,则会触发ifs。

答案 3 :(得分:1)

  

表达式中的变量赋值如何工作?

很明显,也许太明显了,所以我说:总是一样的。表达式是expressionDocs

让我们把它分开:

if ($var = $value)

[1] := if ([2])
[2] := $var = $value
  1. 是if表达式。这是[2]的布尔值。
  2. 是变量赋值表达式。结果为$value
  3. 的值

    因此常见的错误是写

    if ($a = $b)
    

    当它打算写

    if ($a == $b)
    
    输入时可能会发生

    在PHP中,基本上“任何有价值的东西”都是表达式。