[RFC] [DISCUSSION] Improve null-coalescing operator (??) adding empty check (??:)

php.internals

Lito

8 years ago
Related with Request #75833 https://bugs.php.net/bug.php?id=75833 From PHP 7 null-coalescing operator is a great option to avoid a previous exists check with isset. But I think that this comaparison can be improved adding a ternary operator like ??: and check also empty values. Example: -------------------------------------- <?php $foo = ''; // Current response with ternary operator echo $foo ?: 'default'; // 'defaut' // Current response with null-coalescing operator echo $foo ?? 'default'; // '' // Possible response with ternary null-coalescing operator echo $foo ??: 'default'; // 'defaut' // Same response with current PHP available code echo (isset($foo) && $foo) ? $foo : 'default'; // 'default' /** ------------------------------- **/ $foo = false; // Current response with ternary operator echo $foo ?: 'default'; // 'defaut' // Current response with null-coalescing operator echo $foo ?? 'default'; // false // Possible response with ternary null-coalescing operator echo $foo ??: 'default'; // 'defaut' // Same response with current PHP available code echo (isset($foo) && $foo) ? $foo : 'default'; // 'default' /** ------------------------------- **/ $foo = null; // Current response with ternary operator echo $foo ?: 'default'; // 'defaut' // Current response with null-coalescing operator echo $foo ?? 'default'; // 'defaut' // Possible response with ternary null-coalescing operator echo $foo ??: 'default'; // 'defaut' // Same response with current PHP available code echo (isset($foo) && $foo) ? $foo : 'default'; // 'default' /** ------------------------------- **/ unset($foo); // Current response with ternary operator echo $foo ?: 'default'; // PHP Notice:  Undefined variable: foo // Current response with null-coalescing operator echo $foo ?? 'default'; // 'defaut' // Possible response with ternary null-coalescing operator echo $foo ??: 'default'; // 'defaut' // Same response with current PHP available code echo (isset($foo) && $foo) ? $foo : 'default'; // 'default' -------------------------------------- What about? Thanks! Lito.

Marco Pivetta

8 years ago
This: echo (isset($foo) && $foo) ? $foo : 'default'; Is equivalent to: echo $foo ?: 'default'; Please don't endorse usage of undefined variables. On 17 Jan 2018 19:00, "Lito" <info@eordes.com> wrote:

Lito

8 years ago
No $foo ?: 'default' , it's only equivalent to (isset($foo) && $foo) ? $foo : 'default' if $foo exists. Also PHP has added ?? as null-coalescing operator that works with undefined variables/attributes/keys, my proposal is an improvement over this one. I don't want to endorse usage of undefined variables, can be used in a large set of situations, like object attributes, array keys, etc... Anyway thanks for your feedback. Lito. On 17/01/18 19:17, Marco Pivetta wrote:

Nikita Popov

8 years ago
On Wed, Jan 17, 2018 at 7:28 PM, Lito <info@eordes.com> wrote:
> No $foo ?: 'default' , it's only equivalent to (isset($foo) && $foo) ? > $foo : 'default' if $foo exists. > > Also PHP has added ?? as null-coalescing operator that works with > undefined variables/attributes/keys, my proposal is an improvement over > this one. > > I don't want to endorse usage of undefined variables, can be used in a > large set of situations, like object attributes, array keys, etc... >
What is the use case for the ??: operator? Null-coalesce is very common, because undefined/null are typically used to signal default values. Using *any* falsy value to indicate a default value seems a lot more unusual and precarious to me, especially if you consider PHP's specific semantics around falsiness (with the string "0" being falsy). Nikita

Andrey Andreev

8 years ago
Hi, On Wed, Jan 17, 2018 at 8:28 PM, Lito <info@eordes.com> wrote:
> No $foo ?: 'default' , it's only equivalent to (isset($foo) && $foo) ? $foo > : 'default' if $foo exists. > > Also PHP has added ?? as null-coalescing operator that works with undefined > variables/attributes/keys, my proposal is an improvement over this one. > > I don't want to endorse usage of undefined variables, can be used in a large > set of situations, like object attributes, array keys, etc... > > Anyway thanks for your feedback. > Lito. >
There is a shorter version: empty($foo) ? 'default' : $foo; And I think that's quite convenient for the few use cases it has (refer to Nikita's reply). Cheers, Andrey.

Lito

8 years ago
On 17/01/18 19:43, Andrey Andreev wrote:
> Hi, > > > On Wed, Jan 17, 2018 at 8:28 PM, Lito <info@eordes.com> wrote: >> No $foo ?: 'default' , it's only equivalent to (isset($foo) && $foo) ? $foo >> : 'default' if $foo exists. >> >> Also PHP has added ?? as null-coalescing operator that works with undefined >> variables/attributes/keys, my proposal is an improvement over this one. >> >> I don't want to endorse usage of undefined variables, can be used in a large >> set of situations, like object attributes, array keys, etc... >> >> Anyway thanks for your feedback. >> Lito. >> > There is a shorter version: > > empty($foo) ? 'default' : $foo; > > And I think that's quite convenient for the few use cases it has > (refer to Nikita's reply). > > Cheers, > Andrey. >
Yes, I think that: $foo = $foo ??: 'default'; Is more clear and with less code than: $foo = empty($foo) ? 'default' : $foo; As ?? does. Regards, Lito.

Lito

8 years ago
This is a RFC karma request for my wiki account. I want to create a RFC with my proposal: Improve null-coalescing operator (??) adding empty check (??:) First list message is: http://news.php.net/php.internals/101606 The main idea is simplify "empty" check on non existing keys or object attributes. Same as "?:" but also checking undefined. Current check: $value = empty($user->thisOptionalAttributeCanBeEmptyOrNotExists) ? 'without value' : $user->thisOptionalAttributeCanBeEmptyOrNotExists; New feature: $value = $user->thisOptionalAttributeCanBeEmptyOrNotExists ??: 'without value'; I think that could be very usefull on inline "exists" + "not empty" checks with a more clear code. It's possible? Thanks, Lito. On 17/01/18 19:47, Lito wrote: