Wes*_*rch 4 php variables expression variable-assignment
这是我以前见过的做法,但并不常见:在对值本身进行求值的同时将变量分配给一个值(或者是对表达式本身进行求值?)。例子:
// Outputs "The value is 1"
$value = 1;
if ($var = $value) {
echo "The value is $var";
}
Run Code Online (Sandbox Code Playgroud)
似乎与以下相同:
$value = 1;
$var = $value;
if ($var) {
echo "The value is $var";
}
Run Code Online (Sandbox Code Playgroud)
另一个例子:
// Outputs "The value is 1"
$value = 1;
echo "The value is ".$var = $value;
Run Code Online (Sandbox Code Playgroud)
我一直在使用它来缩短我的代码,主要是第一个示例:用于评估第一个变量或表达式,同时将其分配给同一表达式中的另一个变量或表达式。像这样的东西:
if ($status = User::save($data)) {
echo "User saved.";
}
// do something else with $status
Run Code Online (Sandbox Code Playgroud)
这看起来很基本,但我实际上找不到任何关于此的文档,也许我不知道在哪里查找。在看到它多年后,我最近才弄清楚它是如何工作的,我真的很喜欢使用它,但我不想随意使用它。
它使代码更短,也许对某些人来说不太清楚,但绝对减少了重复性。这种方法有什么注意事项吗?这是否完全安全,或者是否存在可能失败或导致意外行为的情况?这似乎不是一种很常见的做法,所以我希望在开始“疯狂”之前找到一个解释。如果有记录,我们将非常感谢指向正确页面的链接。
来自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) { ... }
Run Code Online (Sandbox Code Playgroud)
和
if ($a = 5) { ... }
Run Code Online (Sandbox Code Playgroud)
很棘手!上面的两种常见的惯用写法是为了区分它们:
if (5 == $a) { ... }
if (($a = 5)) { ... }
Run Code Online (Sandbox Code Playgroud)
第一个称为yoda 条件,如果遗漏等于字符,则会导致语法错误。后者在运行时不会有任何不同的行为,但当表达式没有额外的括号时,某些代码检查器会输出警告。