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.
>> >
>>
>
>

Reply via email to