Comments 5
Если в switch вкрутить оператор, допустим, "checkup", который прыгал бы обратно в SWITCH_STRING, получится идеальная конструкция под конечный автомат
Как же заедолбали эти сгенерированные картинки для КДПВ. Вы хоть сами читайте что там понаписано, а то уже антиреклама какая-то получается.
Ну вот что это?

Оба интересны, но это одиночные ветвления - у них нет той разницы между O(N) и O(1), которая делает сравнение if/else vs switch/match таким наглядным.
В разбираемом кейсе для ?? как раз есть неплохое применение. Например, что-то вроде
$status = 'silver';
$discountTiers = [
'gold' => 30,
'silver' => 20,
'bronze' => 10,
];
$discount = $discountTiers[$status] ?? 0;можно было бы добавить в бенчмарк для пущей наглядности.
Интересный вариант :)
L0002 0000 ASSIGN CV0($status) string("silver")
L0004 0001 ASSIGN CV1($discountTiers) array(...)
L0010 0002 T5 = FETCH_DIM_IS CV1($discountTiers) CV0($status)
L0010 0003 T6 = COALESCE T5 0005
L0010 0004 T6 = QM_ASSIGN int(0)
L0010 0005 ASSIGN CV2($discount) T6FETCH_DIM_IS - это тот же поиск в хеш-таблице, что и внутри SWITCH_STRING/MATCH.
По сути это самый прямой способ найти значение по ключу в хеш-таблице, а если нет - вот дефолт. Без обёрток, fallback-цепочек и break.
P.S.: Проверил на 50млн итераций - скорость ?? и match одинаковая (в рамках погрешностей).
Давно заметил, что неочевидные решения зачастую дают лучшую производительность.
Плюс, ещё здесь можно было бы попробовать немного сэкономить на спичках, поместив массив в opcache, чтобы каждый раз не создавать, но я не уверен, будет ли это полезно в нашем случае, или накладные расходы перевесят полезный эффект.
If else VS switch case VS match — разбираем на уровне opcodes