Re: [RFC] Four Pragmatic Directions for PHP: Simplicity, Arrays, Performance, Concurrency
| From: | Dan Liebner | 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]
>