On 15 April 2025 00:01:18 BST, Krinkle <krin...@fastmail.com> wrote:

>Eg:
> 
>$a = function ($a) {
>  $aFn = Closure::current(...);
>  $aFn(4) === Closure::current(4);
>};

I think there's some confusion on this thread; as I understand it, the proposal 
is not for a magic function to *call* the current closure, but a way to get a 
*reference to it*.

So you don't need, or want, the FCC syntax here - that would create a closure 
which, whenever invoked, executes the static method "current" on class 
"Closure".

What you want is to call the Closure::current (or getCurrent) method directly, 
which will give you the existing closure, known as $a in the outer scope. Once 
you have a reference to it, you can pass it around and execute it wherever you 
want.

$aOutside = function (int $foo) use (&$aOutside) {
  // Points to the same object as if you used by-ref
  assert($aOutside === Closure::getCurrent());
  // Store it wherever you like 
  $aInside = Closure::getCurrent();
  assert($aInside === $aOutside);
 
  // Call it like you would any callable 
  $aOutside(42);
  $aInside(42);
  Closure::getCurrent()(42); // note the two sets of parens

   // Capture it into another closure
   $bOutside = function() use ($aInside) {
      // Get a self-reference in that one too 
      $bInside = Closure::getCurrent();
      // Do whatever you like with $aInside and $bInside
   };
};


Rowan Tommins
[IMSoP]

Reply via email to