On Tue, Dec 16, 2025, at 10:49 AM, Deleu wrote:

> I think the problem might be less about the true meaning of => and more 
> about the context that it applies to. You can see that in 3 cases of 
> the arrow it involves some sort of key/value pair (2 array scenarios 
> and 1 match/case). In the case of arrow function, like I said before, 
> arrow functions are kind of a standard that stand up on their own. And 
> even then, the "evaluates to" is only partially because in arrow 
> functions the evaluation does not take immediate effect, it is parsed 
> into a Closure that needs to be invoked. For instance:
>
> ```
> $array = [
>     'key' => throw new Exception('Stop'),
> ];
> ```
>
> Here, the arrow evaluates to an exception that is immediately thrown.
>
> ```
> match ($foo) {
>   'a' => throw new Exception('Stop because of A'),
>   'b' => throw new Exception('Stop because of B'),
> };
> ```
>
> Here, the evaluation is more loose and it only takes effect when there 
> is a match, but it does take effect.
>
> ```
> fn () => throw new Exception('Stop');
> ```
>
> Here, the evaluation never takes effect if the Closure is not invoked.
>
> In these 3 cases, we can see each having its own evaluation rule: 
> immediate, immediate only for the match, and delayed. If I were to put 
> into words, I'd say:
>
> array keys: evaluates to
> match: evaluate to the matched key
> arrow function: parse the syntax, does not evaluate to.
>
> ```
> foreach ($arr as $k => $v) {}
> ```
>
> Here I don't see it only as a bit inconsistent because it's not really 
> evaluating anything anymore. It is assigning a value. And this is where 
> it blows up for me. The first 3 cases we can argue semantics and point 
> of views, but they are minor nuances. Still, they're all cases where 
> something on the right is being evaluated for a reason on the left. On 
> foreach, $v stands on its own. It's not affected / impacted / dicated / 
> evaluated towards the left at all. It's not a bit inconsistent, it's 
> completely different. And the syntax for using () is largely similar to 
> foreach, which is why it should use `as` and not `=>`. 
>
> foreach ($iterator as $key => $value)
> using ($contextManager as $context)
>
> We can see that the only place where arrow ("evaluates to" / =>) is 
> used inside an instruction is in foreach and the syntax is split away 
> from the array itself because the keyword `as` is separating `$k => $v` 
> from the $iterator. I can totally see an argument for:
>
> using (new ContextManager as $contextManager which evaluates to $context)
> using (new ContextManager as $contextManager => $context)
>
> Here, the return of `enter` would be [$this, $context] and the syntax 
> falls into place with a symmetry from foreach. I wouldn't strongly push 
> for this syntax because the following also works

Well, in the vast majority case there will be no need to access the CM within 
the `using` block.  If there is, then it's likely that enterContext() will be 
returning just $this already.  So the $contextManager variable is unnecessary 
noise 99% of the time.

But if we take that out, which get right back to:

using (new ContextManager => $context)

I suppose grammatically this would make sense:

using (new CM() yields $v)

But that's a new keyword that is very close to an existing keyword that means 
something totally different, so probably not the best idea.

> In any case, I don't have a vote and I really like the RFC in general. 

Yay!

--Larry Garfield

Reply via email to