Вы можете сгруппировать выражение, которое вы пытаетесь опровергнуть.
if (!($result['success'] ?? false)) {
Это проблема приоритета оператора .Отрицание имеет более высокий приоритет, чем нулевое слияние, поэтому оно оценивается раньше.
Так что с примером $x = !$a['x'] ?? 'bbb';
Мы говорим: «если !$a['x']
равно нулю, то 'bbb'
».Ну, $a['x']
равен null, поскольку он не определен, но !$a['x']
не равен null, на самом деле true
(потому что !null === true
), поэтому частьвыражение после ??никогда не оценивается.
Вы видите 1, потому что это строковое представление true
.
Если бы оно было моим, я бы написал вместо этого как
if (empty($result['success'])) {
так как empty
будет проверять существование и правдивость одновременно.