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

时间:2020-04-25 20:55:33

标签: php

我正在将 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错误,但是是否有任何方法通过将不赞成使用的代码转换为最新版本来解决此异常

4 个答案:

答案 0 :(得分:2)

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

之前:

 var bucketParams = {
        Bucket : 'the-bucket-name'
      };
      
      // get all files from specific bucket
      s3.listObjects(bucketParams, function(err, data) {
        if (err) {
          console.log("Error", err);
        } else {
          console.log("Success *", data.Contents);
        }
      });

之后:

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

那应该可以解决问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

此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]
            ?? '';

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

答案 3 :(得分:-1)

如果您使用的是复杂的三元运算符 使用(a?b:c)中的任一个? d:e还是a? b:(c?d:e) 修复很容易