On 31/01/2017 20:41, Andrea Faulds wrote:
That's the idea. I'd prefer it if auto-capture was not restricted to single-expression functions (“arrow functions”). Though arrow functions make most sense with auto-capture, it doesn't need to be stricted to them.

I respectfully disagree completely.

Variable scope in PHP is very simple: inside a function, all variables are local to that function, and fetching them from anywhere else requires them to be enumerated with a specific keyword (e.g. global, static, use). The only exceptions are superglobals, the magic $this, and the odd mysterious materialisation like $http_response_header [1]. This means you can look at a function in isolation, no matter how it's declared, and see where every variable comes from.

[1]: http://php.net/manual/en/reserved.variables.httpresponseheader.php

Auto-capture with a full function body would be throwing out that principle. If a variable was read from before it was assigned to, that *might* mean it was unset, or it *might* mean it was imported from an outer scope. Changing the variable name in the outer scope might or might not require you to look for that variable name in the closure; adding a variable in the outer scope might *accidentally* change the behaviour of the closure; and so on.

This is a lot easier in Javascript, although still a cause of confusion, because you can carry on until you hit "var" or "let". I understand C# also has auto-importing closures, but it too requires variables to be declared at some point.


Initially, I was sceptical of auto-capture even with a single expression, but I've come round to its usefulness in short closures. Limiting it to a single expression ensures it's short, and means you can assume that *all* variables in the expression are imported other than those listed as parameters.

Just an opinion, obviously, but I'm glad that the current proposal is limited to and optimised for this single expression case.

Regards,

--
Rowan Collins
[IMSoP]


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to