PHP错误:不建议使用无括号的`a?B:c?d:e`,请使用`(a?B:c)?d:e`或`a?B:(c?d:e)` [重复]

u5rb5r59  于 6个月前  发布在  PHP
关注(0)|答案(3)|浏览(46)

此问题在此处已有答案

Stacking Multiple Ternary Operators in PHP(11个回答)
How to avoid undefined index warning for chains of 'default' values?(4个答案)
三年前关闭。
我正在为一个laravel应用程序使用PHP 7.4,我经常遇到这个异常。

ErrorException (E_DEPRECATED)
Unparenthesized `a ? b : c ? d : e` is deprecated. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)`

字符串
触发此异常的代码为:

foreach ($allLanguages as $languageKey) {
    $original[$languageKey] =
        isset($values[$languageKey])
            ? $values[$languageKey]
            : isset($filesContent[$fileName][$languageKey][$key]) ? $filesContent[$fileName][$languageKey][$key] : '';
}


任何人都可以帮助我解决这个问题吗?
发现这是由于PHP中的一些升级而导致的E_DEPRECATED错误,但是有没有办法通过将不推荐使用的代码转换为最新的代码来解决这个异常**?

voase2hg

voase2hg1#

你需要在你的代码周围添加括号:
之前:

$reference->frotel_vitrine = empty($item->special) ? null : $item->special == 2 || $item->special == 3 ? 'active' : 'deactivate';

字符串
之后:

$reference->frotel_vitrine = empty($item->special) ? null : (($item->special == 2 || $item->special == 3 )? 'active' : 'deactivate');


这应该可以解决问题。

wydwbb8l

wydwbb8l2#

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,因为决策树中的后一个分支具有优先级。
为了避免这种情况,必须将条件括在括号中,以准确地规定应如何处理执行顺序。
另外,我同意@月桂的观点,在php7中,是时候让你接受语法上的甜蜜了,那就是空合并运算符。这将避免优先级问题和使用括号的需要,但是根据你想要的结果,你可能需要重新排序你的条件。
$values的优先级:(Demo

$original[$languageKey] =
    $values[$languageKey]
        ?? $filesContent[$fileName][$languageKey][$key]
            ?? '';


$filesContent的优先级:(Demo

$original[$languageKey] =
    $filesContent[$fileName][$languageKey][$key]
        ?? $values[$languageKey]
            ?? '';


php手册建议不要使用这样的嵌套三进制/条件,这是基于代码清晰度的考虑。我不介意这种情况,我喜欢避免代码膨胀,但其他开发人员可能会采取更纯粹的立场。

am46iovg

am46iovg3#

在这种情况下,您应该使用?? instead of isset and ternaries

foreach ($allLanguages as $languageKey) {
    $original[$languageKey] = $values[$languageKey] ?? $filesContent[$fileName][$languageKey][$key] ?? '';
}

字符串
注意:?? operator was added in 7.0 .你得到的警告是在7.4中添加的,在8.0及更高版本中升级为错误。

相关问题