Welcome! Log In Create A New Profile

Advanced

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

Posted by Lito 
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.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
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" <[email protected]> wrote:

> 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.
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
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:
> 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" <[email protected]
> <mailto:[email protected]>> wrote:
>
> Related with Request #75833 https://bugs.php.net/bug.php?id=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.
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
On Wed, Jan 17, 2018 at 7:28 PM, Lito <[email protected]> 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


> On 17/01/18 19:17, Marco Pivetta wrote:
>
>> This:
>>
>> echo (isset($foo) && $foo) ? $foo : 'default';
>>
>> Is equivalent to:
>>
>> echo $foo ?: 'default';
>>
>> Please don't endorse usage of undefined variables.
>>
>
Hi,


On Wed, Jan 17, 2018 at 8:28 PM, Lito <[email protected]> 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.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
On 17/01/18 19:43, Andrey Andreev wrote:
> Hi,
>
>
> On Wed, Jan 17, 2018 at 8:28 PM, Lito <[email protected]> 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.


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
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:
> On 17/01/18 19:43, Andrey Andreev wrote:
>> Hi,
>>
>>
>> On Wed, Jan 17, 2018 at 8:28 PM, Lito <[email protected]> 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.
>
>


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
Sorry, only registered users may post in this forum.

Click here to login