On 3 November 2025 21:46:15 GMT, Seifeddine Gmati <[email protected]> 
wrote:
>Hello internals,
>
>Tim and I would like to open the discussion on our new RFC that we've been
>working on: "use construct (Block Scoping)".


Hi both, 

I agree with Ed and with Arnaud: this feels like it's trying to squeeze two 
different features into one syntax and ends up with an awkward version of both. 


For what Python calls "context managers", it offers very little: the programmer 
is still reliant on reference counting and cycle collection to actually clean 
up the resource, and objects can't directly interact with the context life 
cycle.

Python in particular has a very carefully designed solution, and the PEP is 
well worth reading: <https://peps.python.org/pep-0343/> I think most of that 
could be directly ported to PHP.


For block scoping of "normal" variables it feels clunky to add an extra block, 
rather than declaring the variable with a keyword like "let" or "var". This is 
particularly obvious in the foreach example, where the variable has to be named 
twice on one line:

use ($value) foreach ($array as &$value) {

Languages with a keyword for declaring variable scope instead let you write the 
equivalent of this:

foreach ($array as let &$value) {

I have said before that an opt-in block scope would solve my main concern about 
automatically capturing variables in closures, because you could write this to 
make scope explicit: 

$foo = fn() {
    let $localVar;
    something($localVar, $capturedVar);
    something_else();
}

With this proposal, that would again be rather verbose: a mandatory extra set 
of braces, to put the scope inside the closure: 

$foo = fn() {
    let($localVar) {
        something($localVar, $capturedVar);
        something_else();
    }
}


I think splitting the two use cases (context managers and scoped variables) 
would allow us to have much better solutions for both.



Rowan Tommins
[IMSoP]

Reply via email to