这是我以前见过的做法,但并不常见:在对值本身进行求值的同时将变量分配给一个值(或者是对表达式本身进行求值?)。例子:
// 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
这看起来很基本,但我实际上找不到任何文档对此,也许我不知道该去哪里寻找。在看到它多年后,我最近才弄清楚它是如何工作的,我真的很喜欢使用它,但我不想随意使用它。
它使代码更短,也许对某些人来说不太清楚,但绝对减少了重复性。这种方法有什么注意事项吗?这是否完全安全,或者是否存在可能失败或导致意外行为的情况?这似乎不是一种很常见的做法,所以我希望在开始“疯狂”之前找到一个解释。如果它is已记录,非常感谢指向正确页面的链接。
From https://www.php.net/manual/en/language.expressions.php:
PHP 使表达式更进一步,就像许多其他语言一样。 PHP 是一种面向表达式的语言,从某种意义上说,几乎一切都是表达式。考虑一下我们已经处理过的例子,$a = 5
。很容易看出这里涉及到两个值,整数常量的值5
,以及值$a
也正在更新为 5。但事实是,这里还涉及一个额外的价值,那就是作业本身的价值。赋值本身的计算结果为指定值,在本例中为 5。实际上,这意味着$a = 5
,无论它做什么,都是一个值为 5 的表达式。因此,写类似$b = ($a = 5)
就像写作$a = 5; $b = 5;
(分号标志着语句的结束)。由于分配是按从右到左的顺序解析的,因此您也可以编写$b = $a = 5
.
许多人会认为你不应该经常使用这种行为。例如,区分:
if ($a == 5) { ... }
and
if ($a = 5) { ... }
很棘手!上面的两种常见的惯用写法是为了区分它们:
if (5 == $a) { ... }
if (($a = 5)) { ... }
第一个称为尤达条件如果省略等于字符,则会导致语法错误。后者在运行时不会有任何不同的行为,但当表达式没有额外的括号时,某些代码检查器会输出警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)