Re: Discussion - Anti-null coercion
| From: | Larry Garfield | Date: | Mon, 30 Oct 2023 15:47:44 +0000 |
| Subject: | Re: Discussion - Anti-null coercion | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-121532@lists.php.net to get a copy of this message | ||
On Mon, Oct 30, 2023, at 11:17 AM, Ilija Tovilo wrote:
> Hi Robert
>
> On Sun, Oct 29, 2023 at 7:31 PM Robert Landers <landers.robert@gmail.com> wrote:
>>
>> Hello Internals,
>>
>> We currently have a null coercion operator: ??, but we lack an
>> anti-null coercion operator.
>> ...
>> fn() =>
>> ($_SERVER['HTTP_X_MY_HEADER'] ?? null)
>> ? md5($_SERVER['HTTP_X_MY_HEADER'])
>> : null;
>> ...
>> This is rather tedious when you have to do it, so, I'd like to discuss
>> adding a new "anti-null coercion" operator: ?!
>>
>> This would collapse the previous verbose code into:
>>
>> fn() =>
>> $_SERVER['HTTP_X_MY_HEADER']
>> ?! md5($_SERVER['HTTP_X_MY_HEADER'];
>
> This does not seem significantly less verbose to me. The main
> motivation for ?? was that it avoids repeating the expression over
> something like ?:. I would see a stronger argument for this feature if
> it offered the same benefit. E.g.
>
> $_SERVER['HTTP_X_MY_HEADER'] ?! md5($$)
>
>> It would have a lower precedence than ?? so that the above line would
>> read from left to right without requiring parenthesis/brackets. The
>> operator would only return the right-hand side if the left-hand side
>> exists (aka, not null), otherwise, it would return null.
>
> I think it should have a higher precedence.
>
> $_SERVER['HTTP_X_MY_HEADER'] ?! md5($$) ?? 'abc'
> ==>
> ($_SERVER['HTTP_X_MY_HEADER'] ?! md5($$)) ?? 'abc'
>
> Otherwise the result is NULL if the header is missing, given that the
> coalesce operator is never executed.
>
> That said, while I've certainly encountered this situation, it's
> nothing a temporary variable can't fix. I don't personally believe
> there's a strong need for such an operator.
>
> Ilija
Another point to note is that for objects, we already have ?->, which effectively serves this
purpose. It is sugar for:
is_null($o) ? null : $o->whatever()
So any new operator would only be relevant for free-standing variables (which is automatically a
code smell) or arrays, and I'm not convinced the latter is a large enough use case in a
decently written code base. (You really should know what your data is, and the best way to do that
is map it into a proper object, at which point ?-> comes into play.)
--Larry Garfield