Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:51841 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 59915 invoked from network); 8 Apr 2011 14:45:18 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 8 Apr 2011 14:45:18 -0000 Authentication-Results: pb1.pair.com header.from=martinscotta@gmail.com; sender-id=pass; domainkeys=bad Authentication-Results: pb1.pair.com smtp.mail=martinscotta@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.220.170 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: martinscotta@gmail.com X-Host-Fingerprint: 209.85.220.170 mail-vx0-f170.google.com Received: from [209.85.220.170] ([209.85.220.170:38701] helo=mail-vx0-f170.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id B3/55-17421-C7F1F9D4 for ; Fri, 08 Apr 2011 10:45:17 -0400 Received: by vxb40 with SMTP id 40so3004731vxb.29 for ; Fri, 08 Apr 2011 07:45:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=sKR99bK6Pq427HiNoXOKaYFEuTNeeLQ5rVr8vNxqgbk=; b=b80djolp62oYp9seVDKXtKglQhmIW49Cjrz/Se5xgNlSuwbKLty1WQB3dxkhqYtJEH OFX2GQxLK22Qc24xoPBG39yz1Oh/QEF/wg0zHwMEbfFM3GkowAbRd6I3oNJJTey8o6PC ECogNQJzqIxMjauo7lFFI9V22fnUoJHxXY2J8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=maXsnNpN3wPwpypbMd7qiSoC55pTeTq51D3BEd09QopjHMQMiSsXd4tiAKe9sqZYmd S5c48GnCeZbt5pxIos0mNIAcByToGheUXc8PwJSyROOhHfsaXDHCYfasOCgfgO0WaXCx 6GikDzg6twjPipliYSlSaFRRloufs5M+xnKR0= MIME-Version: 1.0 Received: by 10.52.88.136 with SMTP id bg8mr3298611vdb.78.1302273914242; Fri, 08 Apr 2011 07:45:14 -0700 (PDT) Received: by 10.220.177.77 with HTTP; Fri, 8 Apr 2011 07:45:14 -0700 (PDT) In-Reply-To: References: <4D950434.3060704@yahoo.com.au> <4D9E0543.1080600@lerdorf.com> <69.82.36433.EC33E9D4@pb1.pair.com> <4D9E34C4.5000406@lerdorf.com> <4D9E429B.20503@sugarcrm.com> <4D9E96B6.6060401@lerdorf.com> Date: Fri, 8 Apr 2011 11:45:14 -0300 Message-ID: To: Hannes Landeholm Cc: Rune Kaagaard , internals@lists.php.net Content-Type: multipart/alternative; boundary=20cf307d015a0f078804a06946da Subject: Re: [PHP-DEV] Implicit isset/isempty check on short-ternary operator From: martinscotta@gmail.com (Martin Scotta) --20cf307d015a0f078804a06946da Content-Type: text/plain; charset=ISO-8859-1 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 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 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. > > > --20cf307d015a0f078804a06946da--