function foo() {
return $result = bar() ? $result : false;
}
function bar() {
return "some_value";
}
foo();
注意:未定义的变量:结果
这是一个错误吗?
bar()应保存到$ result,但不是。但是条件工作正常并且它试图返回$ result或false语句(如果bar()为NULL或false)
PHP 5.4.24
答案 0 :(得分:11)
那是因为operators precedence。做
function foo() {
return ($result = bar()) ? $result : false;
}
- 将以更高的优先级评估作业。
答案 1 :(得分:2)
更优雅的解决方案:
function foo() {
return bar() ?: false;
}
答案 2 :(得分:0)
我们不能这样做:
function foo() {
return bar() ? $result : false;
}
function bar() {
return "some_value";
}
foo();
答案 3 :(得分:0)
即使运算符优先级是正确的,在同一表达式中使用子表达式的副作用也总是有风险的。
即使为了评估条件而有必要评估 openssl req -x509 -out localhost.crt -keyout localhost.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
的结果,也不能普遍保证该结果将在表达式的后面使用,而不是值在作业之前拍摄。
请参见示例Operator Precedence vs Order of Evaluation,该示例在C ++上下文中进行了讨论,并给出了一个经典示例:
$result = bar()
在条件中具有副作用也是很难理解的-它可能被读为a = a++ + ++a;
,这意味着完全不同。
因此,在这种情况下,问题只是PHP不幸的$result == bar()
的关联性,但是编写这样的代码无论如何都不是一个好主意,并且可以通过以下方面使它更加可读性和可靠性更高:效果出现在左侧:
? :
或者在这种情况下,假设$result = bar();
return $result ? $result : false;
不是$result
或global
:
static