Reading a possibly-absent array key has meant naming the expression twice — once in isset(), once as the value — which is fine until the expression is $config['db']['replicas'][0] and the line no longer fits.
// before
$host = isset($config['db']['host']) ? $config['db']['host'] : 'localhost';
// after
$host = $config['db']['host'] ?? 'localhost';
It suppresses the notice as isset() would, and it is not the same as ?: — the short ternary tests for truthiness, so it replaces 0 and the empty string with the default while ?? does not. That difference is the entire reason both exist, and picking the wrong one produces a bug that only appears for the value zero.