Re: [Proposal] Modification to ?: functionality

From: Date: Tue, 26 Nov 2013 18:12:50 +0000
Subject: Re: [Proposal] Modification to ?: functionality
References: 1 2 3 4 5 6  Groups: php.internals 
Request: Send a blank email to internals+get-70423@lists.php.net to get a copy of this message
On Tue, Nov 26, 2013 at 11:08 AM, Etienne Kneuss <colder@php.net> wrote: > > > > On Tue, Nov 26, 2013 at 6:57 PM, Philip Sturgeon <pjsturgeon@gmail.com>wrote: > >> On Tue, Nov 26, 2013 at 12:41 PM, Paul Dragoonis <dragoonis@gmail.com> >> wrote: >> > On Tue, Nov 26, 2013 at 4:58 PM, Chris London <me@chrislondon.co> >> wrote: >> > >> >> On Tue, Nov 26, 2013 at 8:15 AM, Mats Lindh <mats.lindh@gmail.com> >> wrote: >> >> >> >> > On Tue, Nov 26, 2013 at 3:43 PM, Chris London <me@chrislondon.co> >> 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 <OP>= binary operators. So > it would definitely feel weird to use that syntax for something else... > I really like that. I do stuff like that in Javascript right now. > > >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >> >> > > > -- > Etienne Kneuss > http://www.colder.ch >

« previous php.internals (#70423) next »