Re: Implicit isset/isempty check on short-ternary operator
| From: | Hannes Landeholm | Date: | Fri, 08 Apr 2011 15:47:46 +0000 |
| Subject: | Re: Implicit isset/isempty check on short-ternary operator | ||
| References: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-51842@lists.php.net to get a copy of this message | ||
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 <martinscotta@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 <landeholm@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.kg@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·°ÏI¨f
>> > 付, 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 š„®ó
>> > 1㎎χ ôÝ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.
>> >
>>
>
>