On 27/03/2026 15:19, Alex Rock wrote:
In that case, maybe reuse something similar to the null-safe operator ?
Something like `$foo['bar']?`
I think even if you could make it work in the parser, it would be hard
to make that read well with the ternary operator:
$foo['a'] ? ['b'] ? ['c'] : ['d'];
return $foo['one']?['two'];
Looking at that, it's not obvious to me whether it's 'one' or 'two'
which is optional.
return $foo['one'] ?['two'];
return $foo['one']? ['two'];
And here it gets interesting:
return $foo['one']['two']?['three'];
// is roughly equivalent to:
if (!isset($foo['one']) {
trigger_error('Undefined key "one" in ...', ...);
}
return $foo['one']['two']['three'] ?? null;
You can have the same ability with a ? inside the brackets, and without
the ambiguity:
// all three keys required to exist (as of PHP 9):
return $foo['one']['two']['three'];
// 'one' and 'two' required, 'three' optional:
return $foo['one']['two'][?'three'];
// both 'two' and 'three' optional:
return $foo['one'][?'two'][?'three'];
// optional all the way:
return $foo[?'one'][?'two'][?'three'];
This would maybe have similar short-cut semantics to ?->
$foo = [];
return $foo[?'one']['two'];
// OK: the ? neutralises access to the missing section of the array,
short-cutting to NULL
// Similar to $foo?->bar->baz when $foo is NULL
$foo = ['one' => []];
return $foo[?'one']['two'];
// Error: the ? had no effect, so we're trying to access non-existent
key 'two' in the empty array $foo['one']
// Similar to $foo?->bar->baz when $foo->bar exists
But an RFC could pin down those details.
--
Rowan Tommins
[IMSoP]