PHP-将方法转换为闭包

moh*_*jad 5 php oop callback

我想知道有什么方法可以将方法转换为php中的闭包类型吗?

class myClass{

 public function myMethod($param){
  echo $param;
 }

 public function myOtherMethod(Closure $param){
   // do somthing here ...
 }
}

$obj = new myClass();
$obj->myOtherMethod( (closure) '$obj->myMethod' );
Run Code Online (Sandbox Code Playgroud)

这仅是示例,但是我不能使用callable,然后使用[$obj,'myMethod'] 我的类非常复杂,并且我不能仅为闭包类型更改任何内容。所以我需要将方法转换为闭包。还有其他方法还是我应该使用此方法?

$obj->myOtherMethod( function($msg) use($obj){ 
   $obj->myMethod($msg);
} );
Run Code Online (Sandbox Code Playgroud)

我希望使用较少的内存和资源消耗方式。有没有这样的解决方案?

Jso*_*owa 13

PHP 8.1 更新

PHP 8.1 引入了一种从函数和方法创建闭包的更短方法:

$fn = Closure::fromCallable('strlen');
$fn = strlen(...); // PHP 8.1

$fn = Closure::fromCallable([$this, 'method']);
$fn = $this->method(...); // PHP 8.1

$fn = Closure::fromCallable([Foo::class, 'method']);
$fn = Foo::method(...); // PHP 8.1
Run Code Online (Sandbox Code Playgroud)

RFC:PHP RFC:一流的可调用语法


amb*_*ack 6

自 PHP 7.1 起,您可以

$closure = Closure::fromCallable ( [$obj, 'myMethod'] )

自 PHP 5.4 起,您可以

$method = new ReflectionMethod($obj, 'myMethod'); $closure = $method->getClosure($obj);

但是在你的例子中 myMethod() 接受一个参数,所以这个闭包应该像这样调用$closure($msg)