Re: [RFC] Four Pragmatic Directions for PHP: Simplicity, Arrays, Performance, Concurrency

From: Date: Sat, 28 Mar 2026 19:27:44 +0000
Subject: Re: [RFC] Four Pragmatic Directions for PHP: Simplicity, Arrays, Performance, Concurrency
References: 1 2 3 4 5 6 7 8 9  Groups: php.internals 
Request: Send a blank email to internals+get-130477@lists.php.net to get a copy of this message
Yeah, adding ? after expressions gets weird because of ternary operators. I do think the long-form $foo[?'one'][?'two'][?'three'] is acceptable in terms of developer experience considering it's not a super common scenario. I'm not sure if that would be annoying to implement on the C side of things.. - Dan On Sat, Mar 28, 2026 at 2:33 PM Rowan Tommins [IMSoP] <imsop.php@rwec.co.uk> wrote: > 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] >

« previous php.internals (#130477) next »