PHP Ошибка: не заключено в скобки `a? б: c? d: e` устарела. Используйте либо `(a? B: c)? д: е` или `а? b: (c? d: e) ` - PullRequest
0 голосов
/ 25 апреля 2020

Я использую 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] : '';
        }

Может ли кто-нибудь помочь мне решить эту проблему?

Обнаружено, что это ошибка E_DEPRECATED из-за некоторого обновления в PHP, но есть ли способ устранить это исключение с помощью преобразование устаревшего кода в последний ?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Это изменение в 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 .4 вам пора принять syntacti c сладкая сладость, которая является нулевым оператором объединения. Это позволит избежать проблем с приоритетом и необходимости использовать скобки, но в зависимости от желаемых результатов вам может потребоваться изменить порядок ваших условий.

Приоритет $values: ( Демо )

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

Приоритет $filesContent: ( Демо )

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

Ps IIR C, руководство php рекомендует не использовать вложенные троицы / условные выражения, подобные этому, на основе ясности кода. Я не против этого сценария, и мне нравится избегать раздувания кода, но другие разработчики могут занять более пуристскую позицию.

1 голос
/ 26 апреля 2020

В вашем случае вы должны использовать ?? вместо isset и троичные :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...