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

新手上路,请多包涵

我将 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 错误,但是有没有办法 通过将弃用的代码转换为最新的来解决此异常

原文由 humbleiam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

已对 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` 的优先级:( [演示](https://3v4l.org/F9v5O))

\(original[\)languageKey] = \(values[\)languageKey] ?? \(filesContent[\)fileName][\(languageKey][\)key] ?? “;


优先 `$filesContent` : ( [演示](https://3v4l.org/pQ08m))

\(original[\)languageKey] = \(filesContent[\)fileName][\(languageKey][\)key] ?? \(values[\)languageKey] ?? “;

”`

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

原文由 mickmackusa 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

前:

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

那应该可以解决问题。

原文由 Amirex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题