这里有篇文章 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
在闭包转换后变量产生歧义,那既然如此,我觉得他在这里举的这个例子其实就不是很合理,你完全不需要使用闭包转换,还是说我使用的方式不对?