When a nullsafe operator short-circuits, everything to the right of it is skipped — including method arguments, which are not evaluated at all.
$order?->applyDiscount($this->expensiveLookup());
// if $order is null, expensiveLookup() does NOT run.
// that is usually what you want and occasionally hides
// a side effect somebody depended on.
// and it short-circuits past subsequent links too:
$a?->b()->c()->d();
// $a null → the whole expression is null, no error,
// even though ->b() would have returned an object
The short-circuiting is the same rule as && and is easy to forget because the syntax looks like a property access rather than a control-flow construct. The case that bites is an argument with a side effect, which silently stops happening. It also means only the first link needs the operator: writing $a?->b?->c when $b is never null adds noise and suggests to the reader that it might be.