这是我以前见过的一种做法,但不常见:在评估值本身的同时将变量赋值给一个值(或者是表达式本身被评估?)。例如:
// 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,也许我不确定在哪里看。我最近才知道它在看了多年之后是如何工作的,我真的很喜欢使用它,但我不想随意使用它。
它使代码更短,对某些人来说可能不那么清楚,但肯定不那么重复。这种方法有什么警告吗?这是完全安全还是有任何可能导致失败或导致意外行为的情况?这似乎不是一种非常普遍的做法,所以我希望在开始“疯狂”之前找到解释。如果记录 ,将非常感谢指向正确页面的链接。
答案 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中的FALSE
或TRUE
的确切含义。
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
$value
。因此常见的错误是写
if ($a = $b)
当它打算写
时if ($a == $b)
输入时可能会发生。
在PHP中,基本上“任何有价值的东西”都是表达式。