Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:70422 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 82857 invoked from network); 26 Nov 2013 18:08:30 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 26 Nov 2013 18:08:30 -0000 Authentication-Results: pb1.pair.com header.from=ekneuss@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=ekneuss@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.176 as permitted sender) X-PHP-List-Original-Sender: ekneuss@gmail.com X-Host-Fingerprint: 209.85.212.176 mail-wi0-f176.google.com Received: from [209.85.212.176] ([209.85.212.176:41048] helo=mail-wi0-f176.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 39/19-39355-C93E4925 for ; Tue, 26 Nov 2013 13:08:29 -0500 Received: by mail-wi0-f176.google.com with SMTP id hq4so5607690wib.3 for ; Tue, 26 Nov 2013 10:08:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=n/+phDCcfBXBZ1JGnTXbb/KgS6rp+hGk5CO3G2BGWFs=; b=H0XScfzSItc6XccDoog9mQEhZDvFyR5We2mPRiQ6vstvTJTY5ac/gy2s5ea6nsgXLQ FS6SW7HGRWSbvWud/mSxsyaM2gPWJE+ZWXXPUFSiVtzmRshlv69WQX7t0n2G/h1IdU/x KbNNRa6RSjq2CR4N8QyRAw0B3pdakdwcblIfArP82KpSuaCrljaE0zapQCy1icAHs00y 79H/288/akTzHUyWh0n+r4MyQ4/KbC3o9JRt0L1q5Rw20lD4lAiDsC/6uixaSeVauhs9 M8ggS5QNaEvvlDiOeL1ESLCvuen8eFgu+sdrqEziSx4DzocX8Hwp4hOzhvIUJ1BGP5Ru CqYw== X-Received: by 10.180.206.138 with SMTP id lo10mr19153051wic.25.1385489305550; Tue, 26 Nov 2013 10:08:25 -0800 (PST) MIME-Version: 1.0 Sender: ekneuss@gmail.com Received: by 10.216.152.70 with HTTP; Tue, 26 Nov 2013 10:08:05 -0800 (PST) In-Reply-To: References: Date: Tue, 26 Nov 2013 19:08:05 +0100 X-Google-Sender-Auth: lnXpCkSKhuNC9VNZxV1AO2Jznb0 Message-ID: To: Philip Sturgeon Cc: Paul Dragoonis , Chris London , Mats Lindh , "internals@lists.php.net" Content-Type: multipart/alternative; boundary=001a11c26b26e5c70104ec185d70 Subject: Re: [PHP-DEV] [Proposal] Modification to ?: functionality From: colder@php.net (Etienne Kneuss) --001a11c26b26e5c70104ec185d70 Content-Type: text/plain; charset=UTF-8 On Tue, Nov 26, 2013 at 6:57 PM, Philip Sturgeon wrote: > On Tue, Nov 26, 2013 at 12:41 PM, Paul Dragoonis > wrote: > > On Tue, Nov 26, 2013 at 4:58 PM, Chris London wrote: > > > >> On Tue, Nov 26, 2013 at 8:15 AM, Mats Lindh > wrote: > >> > >> > On Tue, Nov 26, 2013 at 3:43 PM, Chris London > wrote: > >> > > >> >> I believe these two statements are functionally equivalent: > >> >> > >> >> $foo = $foo ? $foo : 'default'; > >> >> > >> >> $foo = $foo ?: 'default'; > >> >> > >> > > >> > They are. > >> > > >> > > >> > I would like to change it so it also checks for isset() so I propose > the > >> >> following would be functionally equivalent: > >> >> > >> >> $foo = isset($foo) && $foo ? $foo : 'default'; > >> >> > >> >> $foo = $foo ?: 'default'; > >> >> > >> > > > > We can't change the behaviour of ?: that ship has already sailed, we'll > > just be hurting existing codebases on upgrading and more user education > is > > required to understand non-visual changes in syntax like this, lets try > to > > learn from our mistakes by not changing 'behaviour' anymore. > > > > An alternative syntax that is similar and not ugly would be good since > the > > ?: behaviour was broken from the start since you still need to run > isset() > > before running ?: which was the problem we tried to solve in the first > > place but it just didn't happen. > > > > I don't like the @ symbol it's too different from what's already there on > > the ternary logic. > > > > Proposal: $foo = $arr['value'] ?:: ""; > > > > Thoughts? > > > >> > >> > The would break the assumption that a reference to an uninitialized > value > >> > would generate a notice, unless explicitly handled in the logic. > >> > > >> > While I also would like to have something similar to ?: to handle > default > >> > values for array keys, etc., this would change a fundamental > assumption > >> > that as been in place for many years now. I'm not sure if that's a BC > >> break > >> > that would be acceptable this late. An alternative operator may be > more > >> > suitable. > >> > > >> > >> What do you think about using: > >> > >> $foo = $foo @: 'default'; > >> > >> and possibly > >> > >> $foo @= 'default'; > >> > >> > >> > >> > > >> > The change proposed has also been discussed several times since the > >> > implementation of ?:. See the ifsetor-RFC: > >> > > >> > https://wiki.php.net/rfc/ifsetor > >> > > >> > It also contains links to the discussion around the feature back then. > >> > > >> > --mats > >> > > >> > > This seems like a cracking time to suggest: > > $x ||= $y; > > The difference? Anything left of the ? SHOULD fail if it is not set, > because you are using it in a condition which is dangerous and odd for > other types of condition, but adding in this new syntax (similar to > Ruby) would essentially evaluate to this: > empty($x) ? $y : $x; > > This gives keeps the behavior of ternary operators working in the same > way, but adds what we want: the ability to nicely set defaults for > variables and array keys that may not be set. > To me this reads as $x = $x || $y like all the = binary operators. So it would definitely feel weird to use that syntax for something else... > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- Etienne Kneuss http://www.colder.ch --001a11c26b26e5c70104ec185d70--