8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

PHP 错误:不带括号的 `a ? b : c ? d : e` 已弃用。请使用 `(a ? b : c) ? d : e` 或 `a ? b : (c ? d : e)`

codeandcloud 1月前

8 0

我正在为 laravel 应用程序使用 PHP 7.4,并且经常收到此异常。ErrorException (E_DEPRECATED)不带括号的 `a ? b : c ? d : e` 已弃用。使用 `(a ? b : c...

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

帖子版权声明 1、本帖标题:PHP 错误:不带括号的 `a ? b : c ? d : e` 已弃用。请使用 `(a ? b : c) ? d : e` 或 `a ? b : (c ? d : e)`
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由codeandcloud在本站《wordpress》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 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 :( 演示 )

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

    优先考虑 $filesContent :( 演示 )

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

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

  • 它显示了已弃用的内容,但我们如何知道何时会出现致命错误,以便我们可以在特定日期之前花一些时间来纠正该代码?

  • \'它显示已弃用\'...那么现在就是开始修复您的项目的时间。

  • 从 PHP7.4 开始已弃用,从 PHP8 开始将导致严重后果。3v4l.org/TG4g2

  • $d = $a?$d:(\''\' === $d[0]?$d:\''$d'\');@Nav

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

    前:

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

    这应该可以解决问题。

  • 就您而言,您应该使用 ?? 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 及更高版本中升级为错误。

返回
作者最近主题: