PHP 错误:未加括号的 `a ?乙:丙? d : e` 已弃用。使用 `(a ? b : c) ? d : e` 或 `a ? b : (c ? d : e)` [重复]

问题描述 投票:0回答:3

我正在将 PHP 7.4 用于 laravel 应用程序,我经常收到此异常。

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 错误,但是有什么方法可以通过将不推荐使用的代码转换为最新代码来解决这个异常

php foreach reference deprecated isset
3个回答
9
投票

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
,因为决策树中后面的fork优先。

为避免这种情况,您必须将条件括在括号中以准确指示应如何处理执行顺序。

此外,我同意@Laurel 的观点,在 php7 中,您是时候接受 null 合并运算符的语法甜头了。这将避免优先级问题和使用括号的需要,但根据您想要的结果,您可能需要重新排序您的条件。

优先

$values
:(Demo

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

优先

$filesContent
:(Demo

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

附言IIRC,php 手册建议不要在代码清晰的基础上使用这样的嵌套三元/条件。我不介意这种情况,我喜欢避免代码膨胀,但其他开发人员可能会采取更纯粹的立场。


9
投票

您需要在代码周围添加括号:

之前:

$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');

这应该可以解决问题。


3
投票

在你的情况下,你应该使用

??
而不是
isset
和三元组

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

© www.soinside.com 2019 - 2024. All rights reserved.