Dear Internals

I'm very happy that this is getting some attention again. Please allow
me to give my 2 cents too. The text below can also be seen nicely
formatted at https://gist.github.com/909711.

## Intro ##

Isset and IsNotEmpty operators have for sure been a hot topic for several years
now and in my opinion rightly so. The non-DRY style of:

    $my_array['my_long_boring_key'] = !empty($my_array['my_long_boring_key'])
                  ? $my_array['my_long_boring_key'] : 'Default value';
    $my_array['my_long_boring_key'] = isset($my_array['my_long_boring_key'])
                  ? $my_array['my_long_boring_key'] : 'Default value';

is a true day-to-day hassle and addressing this annoyance would be a
big win for
the PHP community as a whole. As PHP has two keywords `isset` and `empty` that
can check for a non existing variable without throwing errors I think there
should exist two assignment/ternary operators who mirror those.

I have been thinking [1] about the same problem for my meta language Snow and
also ended up using `??` as an isset operator.

## Proposal ##
I propose that two new operators `??` (IssetOperator) and `?!`
(NotEmptyOperator) are added. `??` mirrors `isset` and `?!` mirrors `!empty`.
They are chainable ad nauseum but not with each other.

They would work like this:

### Example 1 : Ternary shortcut ###
Old syntax:
    $a = isset($b) ? $b : 42;
    $a = !empty($b) ? $b : 42;

New syntax:
    $a = $b ?? 42;
    $a = $b ?! 42;

### Example 2 : Direct assignment ###
Old syntax:
    $arr['key'] = isset($arr['key']) ? $arr['key'] : 42;
    $arr['key'] = !empty($arr['key']) ? $arr['key'] : 42;

New syntax:
    $arr['key'] ??= 42;
    $arr['key'] ?!= 42;

### Example 3 : Works with statements too ###
Old syntax:
    // a)
    $tmp = get_stuff('foo');
    $a = isset($tmp) ? $tmp : 42;

    // b)
    $tmp = get_stuff('foo');
    $a = !empty($tmp) ? $tmp : 42;

New syntax:
    // a)
    $a = get_stuff('foo') ?? 42;

    // b)
    $a = get_stuff('foo') ?! 42;

### Example 4 : Chaining ###
Old syntax [2]:
    $a = false;
    if (!empty($c) {
        $a = $c;
    } else {
        $tmp = get_stuff();
        $a = !empty($tmp) ? $tmp : false;
    }
    if ($a === false) {
        $a = !empty($c) ? $c : 42;
    }

New syntax:
    $a = $c ?! get_stuff() ?! $b ?! 42;

### Example 5 : Illegal syntax ###
    $a = $d ?? $c ?! $b ?? 42; // `??` and `?!` cannot be mixed.

## References ##
     * [1]: http://code.google.com/p/php-snow/wiki/EmptyIssetOperators
     * [2]: This could also be done by nesting ternary operators, but that gets
            even more unreadable I think.

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to