I think "?!" wouldn't work as an operator as it would conflict with ternary comparision + not operator. Also I don't see the point of adding an operator for "empty" as the function/construct itself is pretty confusing and non-useful as you have to memorize all the things that happen to be considered "empty" by it and those things has too align up with the things you want to check for by chance. (I never use it.)
Empty-ness is just one of a billion things you might want to write a comparison for (and it's not even well defined). Having an operator for that would be crazy. Dealing with possibly undefined indexes/properties is a very common use case though which is why I think it deserves an operator. The "empty comparison" thing is a _separate issue_ and it can simply be dealt with by separating the assignment and comparison into two expressions... ~Hannes On 8 April 2011 15:19, Rune Kaagaard <rumi...@gmail.com> wrote: > 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. >