On Thu, 9 Jun 2022 at 21:27, Nikita Popov <nikita....@gmail.com> wrote:

> On Thu, Jun 9, 2022 at 8:15 PM Arnaud Le Blanc <arnaud...@gmail.com>
> wrote:
>
>> Hi,
>>
>> On jeudi 9 juin 2022 18:46:53 CEST Marco Pivetta wrote:
>> > ## nesting these functions within each other
>> >
>> > What happens when/if we nest these functions? Take this minimal example:
>> >
>> > ```php
>> > $a = 'hello world';
>> >
>> > (fn () {
>> >     (fn () {
>> >         echo $a;
>> >     })();
>> > })();
>> > ```
>>
>> Capture bubbles up. When an inner function uses a variable, the outer
>> function
>> in fact uses it too, so it's captured by both functions, by-value.
>>
>> This example prints "hello world": The inner function captures $a from
>> the
>> outer function, which captures $a from its declaring scope.
>>
>> This is equivalent to
>>
>> ```php
>> (function () use ($a) {
>>     (function () use ($a) {
>>         echo $a;
>>     })();
>> })();
>> ```
>>
>> > ## capturing `$this`
>> >
>> > In the past (also present), I had to type `static fn () => ...` or
>> `static
>> > function () { ...` all over the place, to avoid implicitly binding
>> `$this`
>> > to a closure, causing hidden memory leaks.
>> >
>> > Assuming following:
>> >
>> >  * these new closures could capture `$this` automatically, once detected
>> >  * these new closures can optimize away unnecessary variables that
>> aren't
>> > captured
>> >
>> > Would that allow us to get rid of `static fn () {` declarations, when
>> > creating one of these closures in an instance method context?
>>
>> It would be great to get rid of this, but ideally this would apply to
>> Arrow
>> Functions and Anonymous Functions as well. This could be a separate RFC.
>>
>
> I've tried this in the past, and this is not possible due to implicit
> $this uses. See
> https://wiki.php.net/rfc/arrow_functions_v2#this_binding_and_static_arrow_functions
> for a brief note on this. The tl;dr is that if your closure does "fn() =>
> Foo::bar()" and Foo happens to be a parent of your current scope and bar()
> a non-static method, then this performs a scoped instance call that
> inherits $this. Not binding $this here would result in an Error exception,
> but the compiler doesn't have any way to know that $this needs to be bound.
>
> Regards,
> Nikita
>

Hey Nikita,

Do you have another example? Calling instance methods statically is...
well... deserving a hard crash :|

Marco Pivetta

https://twitter.com/Ocramius

https://ocramius.github.io/

Reply via email to