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

hum*_*iam 14 php foreach reference deprecated isset

在 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)`
Run Code Online (Sandbox Code Playgroud)

触发此异常的代码是:

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

有人可以帮我解决这个问题吗?

发现这是由于 PHP 中的某些升级而导致的 E_DEPRECATED 错误,但是有没有办法通过将已弃用的代码转换为最新的代码来解决此异常

小智 12

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

前:

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

Run Code Online (Sandbox Code Playgroud)

后 :

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

Run Code Online (Sandbox Code Playgroud)

那应该可以解决问题。


mic*_*usa 10

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);
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)
array (
  'en' => '',
  'es' => 'Spanish2',
  'fr' => 'French',
)
Run Code Online (Sandbox Code Playgroud)

作为你的脚本的人类读者,我会假设你的条件的读取是从左到右的——但这将作为Spanish1输出值。

即使在 php7.4 之前,输出也是Spanish2因为决策树中的后一个分支被赋予优先级。

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

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

优先$values:(演示

$original[$languageKey] =
    $values[$languageKey]
        ?? $filesContent[$fileName][$languageKey][$key]
            ?? '';
Run Code Online (Sandbox Code Playgroud)

优先$filesContent:(演示

$original[$languageKey] =
    $filesContent[$fileName][$languageKey][$key]
        ?? $values[$languageKey]
            ?? '';
Run Code Online (Sandbox Code Playgroud)

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