php 中的这一更改是为了消除决策树中的歧义,以便有一个明确的条件执行顺序。
弃用警告在此处重现:
代码:
$allLanguages = ['en', 'es', 'fr'];
$values = ['es' => 'Spanish1'];
$filesContent = [
'foo' => [
'es' => ['bar' => 'Spanish2'],
'fr' => ['bar' => 'French']
]
];
$fileName = 'foo';
$key = 'bar';
$original = [];
foreach ($allLanguages as $languageKey) {
$original[$languageKey] =
isset($values[$languageKey])
? $values[$languageKey]
: isset($filesContent[$fileName][$languageKey][$key])
? $filesContent[$fileName][$languageKey][$key]
: '';
}
var_export($original);
输出:
Deprecated: Unparenthesized `a ? b : c ? d : e` is deprecated. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /in/TG4g2 on line 17
array (
'en' => '',
'es' => 'Spanish2',
'fr' => 'French',
)
作为您脚本的人类读者,我会假设您条件的读取是从左到右的 - 但这将 Spanish1
作为输出值。
即使在 php7.4 之前,输出也是 Spanish2
因为决策树中的后者分支优先。
为了避免这种情况,您必须将条件括在括号中,以明确规定如何处理执行顺序。
此外,我同意 @Laurel 的观点,在 php7 中,是时候接受空合并运算符这种语法上的甜蜜了。这将避免优先级问题和使用括号的需要,但根据您想要的结果,您可能需要重新排序条件。
优先考虑 $values
:( 演示 )
$original[$languageKey] =
$values[$languageKey]
?? $filesContent[$fileName][$languageKey][$key]
?? '';
优先考虑 $filesContent
:( 演示 )
$original[$languageKey] =
$filesContent[$fileName][$languageKey][$key]
?? $values[$languageKey]
?? '';
Ps IIRC,php 手册建议不要使用这样的嵌套三元/条件,因为这样代码会比较清晰。我不介意这种情况,我喜欢避免代码膨胀,但其他开发人员可能会采取更纯粹的立场。