Дмитрий Дерепко на прошлой неделе получил карму в internals и сейчас активно хэндлит две интересные темы для PHP 8.5.
1. return, break и continue — выражения
while ($condition) {
$element = $element->parent() ?? break;
// ...
}
$resolved = $this->resolve($value) ?? return;
У себя на канале Дмитрий привёл мотивацию для этого изменения. У меня пока нет однозначного мнения. С одной стороны, да, код выглядит лаконичнее, с другой — ранние
return менее заметны и чтение осложняется.Кстати, одну лаконичную конструкцию мы сами себе давно запретили в PSR 2 и 12:
if ($condition) return/break/continue;
Если инструкции станут выражениями, то правило "There MUST NOT be more than one statement per line" на них не будет распространяться, но суть-то не поменяется...
Также реализация всей задумки сопряжена с трудностями на уровне компиляции (см. комментарии Ильи), так что пока игра как будто бы не стоит свеч. Пишите, в комментариях что вы думаете по этому поводу.
2. match (true) {} -> match {}
Ранее Ларри уже готовил такой RFC, но до голосования он так и не дошёл. Новое обсуждение тут: https://externals.io/message/126266. Рассмотрим типичный пример использования
match (true):
match (true) {
$value === null => ...,
is_string($value) => ...,
$value instanceof A => ...,
}
Почему мы вынуждены писать код наоборот? Потому что у нас пока нет pattern matching.
match ($value) is {
null => ...,
string => ...,
A => ...,
}
Но даже тогда
match (true) всё равно будет полезен, так как несложно придумать пример, где проверяемые условия относятся не к одному значению, а к нескольким. Писать match вместо match (true) так же естественно, как if ($a && $b) вместо if (($a && $b) === true). Я всеми руками и ногами за это изменение, желаю Дмитрию терпения и удачи!