Это изменение в 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 рекомендует не использовать вложенные троицы / условные выражения, подобные этому, на основе ясности кода. Я не против этого сценария, и мне нравится избегать раздувания кода, но другие разработчики могут занять более пуристскую позицию.