On 8 Sep 2014, at 09:06, Michael Wallner <m...@php.net> wrote: > On 07/09/14 14:25, Andrea Faulds wrote: >> >> On 7 Sep 2014, at 13:22, Sherif Ramadan <theanomaly...@gmail.com> >> wrote: >> >>> I've played around with this branch for a bit and seems reasonable, >>> passes the tests, and doesn't seem to have any serious >>> issues/memories leaks AFAICT. >> >> There’s actually a quite serious issue just now, which is that it >> evaluates the first operand twice if it’s not empty. This is because >> $a ?: $b is expanded to empty($a) ? $b : $a, such that if you did >> something which mutates state in there, it’d happen twice. This is >> obviously not good, and I’m going to figure out how to fix this. >> > > This could very well be the reason why it is like it is today.
I doubt it, it’s possible to avoid double-evalution, and I don’t think it’s terribly difficult. I just did things the easy way and it turns out that has problems. On 8 Sep 2014, at 13:04, Shashank Kumar <shashankkumar...@gmail.com> wrote: > Rather than giving a new meaning to an old operator why not have a different > operator for this? > .NET has a 'null coalescing' operator for the same purpose which works out > quite well in the given situation > and is non-ambiguous as well. > http://msdn.microsoft.com/en-us/library/ms173224.aspx We could add such an operator, perhaps with the ?? syntax. However, I don’t really like the idea. It’s too similar to ?: so I don’t think it’d be accepted, and even if it was, I’m not sure we really need another operator. I’d much rather just make ?: do what, IMO, is the right thing and what it always should have done. On 8 Sep 2014, at 08:58, Simon Schick <simonsimc...@gmail.com> wrote: > I feel more like Sherif Ramadan. Even so I've quite often been in the same > situation, I don't think it's a good solution to change something like that, > just for the shorthand-operator. > > I think, the notice is really valuable when accessing the value and doing > something with it - like myFunction($_GET['not_set']), but if you're just > checking for the existence, I, too, think it is more annoying. My way was to > suppress it by adding the silence-operator ;) > > I always used like: > @$_GET['mykey'] ?: ”” The silence operator is bad for three reasons. First, it’s very slow, having a significant performance impact. Second, @ silences not only innocuous E_NOTICEs, but *all* errors, even very serious ones. That’s not good. The third is that it interacts with some error handlers badly, or so I’ve heard. > I can't come up with a good mid-way right now, but I don't think it's a good > way to change this ONLY for the short-hand operator. Actually, there is a case for doing it for $a ?: $b and not $a ? $a : $b, in that it could avoid double evaluation (you’d be able to do foo()[0] ?: $bar and foo() would only be called once) and because with the full-length ternary operator, it wouldn’t really help you much: $_GET[‘foo’] ? $_GET[‘foo’] : ‘blah’ isn’t much shorter than the version with explicit isset. -- Andrea Faulds http://ajf.me/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php