On Fri, 25 Oct 2019 at 03:37, Ken Stanley <[email protected]> wrote:
> This got rejected for being too large???
>
If you trim the quotes in your replies to just the parts needed for
context, it keeps the message shorter, and makes it much easier to read
through.
> > The fact that it’s a counterpart to an existing syntax l, I believe,
> > further warrants it’s inclusion into the language.
>
As I mentioned before, it doesn't feel to me a very natural complement. The
use cases for the new operator don't feel like "the negation" of the use
cases for the existing ?? operator, and although different from null-safe
calls, have more in common with them than "coalescing".
> >> The repetition becomes more relevant if the expression we would repeat
> >> is really long:
> >>
> >> isset($something['something']['something']['something']) !??
> >> $something['something']['something']['something']->foo();
> >
> >
> > This would be invalid because isset() returns Boolean
I suspect that was just a mistake; the point was the new operator doesn't
save any repetition in an expression such as:
$something['something']['something']['something'] !??
$something['something']['something']['something']->foo();
Which in this particular case could be rewritten if we had a null-safe call
operator, and would gain a lot more readability:
$something['something']['something']['something']?->foo();
> > As far as flow control, let’s make no mistake, ??, ?:, and the idea of
> !??
> > are all succinct forms of flow control. To pretend otherwise is a bit
> > naive.
>
I think you're misunderstanding what people mean by "flow control"; the key
point is whether you're using the operator to obtain a value, or to trigger
a side effect.
For instance, this would not generally be considered "flow control":
$x = $someFlag ? 1 : 2;
Yes, strictly speaking, you're selecting one of two paths, but the only
side-effect is an assignment, outside the expression. Compare to this,
where the value of the expression is never even used, and you're just
choosing a side-effect:
$someFlag ? deleteUser() : logOut();
Your second example was better in this respect, because it used the result:
$user = $application->getUser() !?? $this->getUser();
However, is this actually the desired code? If I'm not mistaken, it would
de-sugar to this:
if ( isset($application->getUser() ) {
$user = $this->getUser();
} else {
$user = null;
}
Given that your specified aim is to look up a default, isn't this actually
a case for the existing null-coalesce operator?
$user = $application->getUser() ?? $this->getUser();
// or if the precedence is the other way around:
$user = $this->getUser() ?? $application->getUser();
Regards,
--
Rowan Tommins
[IMSoP]