这里有篇文章 Link 是关于 PHP 的(...)闭包转换语法的,里面有一个例子是通过闭包转换使得外部函数调用私有成员变量:
<?php class MyClass { public function __construct(private string $value) { } } echo Closure::fromCallable(fn () => $this->value) ->call(new MyClass('THIS IS A PRIVATE VALUE')); // OUTPUTS // THIS IS A PRIVATE VALUE
然而转换的方法本身就是一个闭包函数,所以我发现其实这里不做转换一样可以得到结果:
<?php class MyClass { public function __construct(private string $value) { } } echo (fn () => $this->value)->call(new MyClass('THIS IS A PRIVATE VALUE')); // OUTPUTS // THIS IS A PRIVATE VALUE
而当你试图真正将一个类方法转换成闭包时,你却会得到一个 Warning:
<?php class MyClass { public function __construct(private string $value) { } } $classMethod = new class { public function method() { return $this->value; } }; echo Closure::fromCallable([$classMethod, 'method'])->call(new MyClass('THIS IS A PRIVATE VALUE')); // OUTPUTS // PHP Warning: Cannot bind method class@anonymous::method() to object of class MyClass
关于这个 Warning 我也查到了一些讨论:
https://stackoverflow.com/questions/47165930/php-binding-method-to-another-class
https://bugs.php.net/bug.php?id=73931&edit=3
我理解大概的意思就是为了避免 $this
在闭包转换后变量产生歧义,那既然如此,我觉得他在这里举的这个例子其实就不是很合理,你完全不需要使用闭包转换,还是说我使用的方式不对?