Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:51838 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 50596 invoked from network); 8 Apr 2011 13:19:41 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 8 Apr 2011 13:19:41 -0000 Authentication-Results: pb1.pair.com smtp.mail=rumi.kg@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=rumi.kg@gmail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.42 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: rumi.kg@gmail.com X-Host-Fingerprint: 209.85.212.42 mail-vw0-f42.google.com Received: from [209.85.212.42] ([209.85.212.42:38946] helo=mail-vw0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A9/04-17421-C6B0F9D4 for ; Fri, 08 Apr 2011 09:19:40 -0400 Received: by vwl1 with SMTP id 1so2960487vwl.29 for ; Fri, 08 Apr 2011 06:19:38 -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=Hmtu1v7T/g2m/h1S5Fk105ppBTkyvWhktPryiVD2bxI=; b=k+h7PJmZkJ412HADL9GuuILotUU5Q6JL73C028XjREWH+p465ENa9AaC/gIVOB7N42 lZvnVddePf5QbHgQojk8Tqee1UITuJXXulor64hh736R3HrToByxZfIz4HLhJdH3ad+u tg3VxmCO1+TAU5qQX63AdHdz39md9jl9gQdkI= 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=g4diRIsumRAw008cw7NKXheac4EUpRTmRbYWfq6EDScpaZhVuiVDWvunXv8dZTYjNK VhAUn1UhYQArKnQppPvdeqmXRN9AHtrfNTDId3SeB7fSA8YdASyVZy6JJb+YiyVM/4Uq 2tUmI1Oxil7GnZb0X7IqgPqBnIpCk5iGogxcs= MIME-Version: 1.0 Received: by 10.52.174.38 with SMTP id bp6mr1348204vdc.90.1302268778022; Fri, 08 Apr 2011 06:19:38 -0700 (PDT) Received: by 10.52.165.40 with HTTP; Fri, 8 Apr 2011 06:19:37 -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 15:19:37 +0200 Message-ID: To: Hannes Landeholm Cc: Adam Richardson , internals@lists.php.net Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [PHP-DEV] Implicit isset/isempty check on short-ternary operator From: rumi.kg@gmail.com (Rune Kaagaard) 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.