Nullsafe Operator (?->)
Also Known As
nullsafe operator
?-> operator
PHP 8 nullsafe chain
TL;DR
Chains method calls and property accesses on potentially-null objects without nested null checks; returns null on the first null encounter.
Explanation
Introduced in PHP 8.0, the nullsafe operator ?-> short-circuits a method/property chain when it encounters null, returning null rather than throwing an Error. This eliminates deeply nested isset() / !== null guards for fluent interfaces. For example, $user?->getProfile()?->getAvatar()?->getUrl() returns null if any step is null. It is not a substitute for proper null handling in all cases — side-effect-producing methods in a chain may not execute if a preceding step returns null.
Common Misconception
✗ The nullsafe operator ?-> is the same as checking with isset() first. isset() checks for null and undefined; ?-> short-circuits the chain and returns null on the first null encountered. They are not equivalent for complex chains and ?-> is significantly more readable.
Why It Matters
?-> returns null instead of throwing an error when called on null — it makes optional relationship traversal safe without wrapping every step in an if-null check.
Common Mistakes
- Using ?-> on objects that should never be null — hides bugs that should throw.
- Expecting ?-> to short-circuit side effects in method arguments — arguments are evaluated before the null check.
- Not using it consistently — mixing isset() checks and ?-> in the same codebase for the same pattern.
- Using it with property access but forgetting it works for method calls too — both are supported.
Code Examples
✗ Vulnerable
// Without nullsafe — verbose:
$country = null;
if ($user !== null) {
$profile = $user->getProfile();
if ($profile !== null) $country = $profile->getCountry();
}
// With nullsafe operator:
$country = $user?->getProfile()?->getCountry();
✓ Fixed
// Before PHP 8.0 — tedious null guards
$city = null;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$city = $address->getCity();
}
}
// PHP 8.0+ nullsafe operator — short-circuits on null
$city = $user?->getAddress()?->getCity();
// Works with method chains and property access
$countryCode = $order?->getCustomer()?->getAddress()?->getCountry()?->getIsoCode();
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
15 Mar 2026
Edited
22 Mar 2026
Views
26
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Amazonbot 7
Perplexity 5
Unknown AI 2
Ahrefs 2
Google 2
Also referenced
How they use it
crawler 17
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟢 Low
⚙ Fix effort: Low
⚡ Quick Fix
Use $user?->getAddress()?->getCity() instead of $user !== null ? $user->getAddress() : null — the nullsafe operator short-circuits the entire chain on the first null
📦 Applies To
PHP 8.0+
web
cli
queue-worker
🔗 Prerequisites
🔍 Detection Hints
$obj !== null ? $obj->method() : null; nested ternary null checks before method calls in PHP 8.0+ code
Auto-detectable:
✓ Yes
rector
phpstan
php-cs-fixer
⚠ Related Problems
🤖 AI Agent
Confidence: Medium
False Positives: Medium
✓ Auto-fixable
Fix: Low
Context: Line