?? chains left to right and returns the first operand that is not null, which reads like a safe navigation operator and is not one. It only guards array offsets and property reads — never a method call.
$name = $request['name'] ?? $session['name'] ?? 'anonymous'; // fine
$city = $order->address->city ?? 'unknown'; // fine if address is null
$city = $order->getAddress()->city ?? 'unknown'; // fatal if getAddress() returns null
The property chain is safe because ?? is built on the same machinery as isset(), which tolerates a null intermediate. As soon as a method call appears in the chain the call happens first, and ->city on null is a fatal error before the operator is ever reached. There is no nullsafe operator in this version; the only fix is an early return.