Hi Robert,

pt., 24 lis 2023 o 10:24 Robert Landers <landers.rob...@gmail.com>
napisał(a):

> ...
> You can also emulate this with:
>
> class Defer {
>   private function __construct(private \Closure $callback) {}
>   public function __destruct() { $this->callback(); }
>   public static function _(\Closure $callback) { return new
> self($callback); }
> }
>
> and use it like:
>
> function writeSomeStuff() {
>   // open files
>   $deferred = Defer::_($closeFiles(...));
>   // do stuff
> }
>
> So long as a reference exists to $deferred variable, the deferred
> method won't be run. If the variable is local to the method/function
> being run it, the deconstructor will be called after the function
> returns.
>
> It isn't the most beautiful thing in the world, and easy to forget to
> store the result of Defer, but it is handy sometimes.
>

This is interesting which makes me thinking if forget to store it could be
prevented.
I think requiring a ref could help with that:

class Defer {
  private function __construct(private \Closure $callback) {}
  public function __destruct() { ($this->callback)(); }
  public static function _(\Closure $callback, &$var) { $var = new
self($callback); }
}

$deferred = Defer::_($closeFiles(...), $foo);

Without $foo there'd be an ArgumentCountError.

Cheers,
Michał Marcin Brzuchalski

Reply via email to