Re: Discussion - Anti-null coercion

From: 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

« previous php.internals (#121532) next »