Operators should have very specific purpose and function... a ternary if statement should just be another way to express a normal if statement. Making the ? operator suppress the not defined error would be a poor compromise, making PHP inconsistent. Then I'd rather have access of non-defined array indexes return null instead (simply removing the not-defined notice for arrays - where array_key_exists and isset would still work like normal if you want to check for undefined).
~Hannes On 8 April 2011 16:45, Martin Scotta <martinsco...@gmail.com> wrote: > I just feels that !empty($arr['key']) or isset($arr['key']) do not express > the real meaning, instead I would choose to write array_key_exists('key', > $arr). It may be slower but it clearly express what I meant. > > Regarding the operators, I believe they will do more harm than good. > To check if a variable was already defined is a bad programing habit, these > operators will encourage that kind of things > > In the other hand, the isset check inside the condition ?: would silently > improve not-so-well written code, and could be a good feature for the lang. > > Martin Scotta > > > > On Fri, Apr 8, 2011 at 11:27 AM, Hannes Landeholm <landeh...@gmail.com>wrote: > >> 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. >> > >> > >