将PHP方法转换为闭包

kq0g1dla  于 2023-06-28  发布在  PHP
关注(0)|答案(2)|浏览(118)

在PHP中有没有一种方法可以将方法转换为闭包类型?

class myClass {

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

    public function myOtherMethod(Closure $param) {
        // Do something here...
    }
}

$obj = new myClass();
$obj->myOtherMethod((closure) '$obj->myMethod');

这只是一个例子,但我不能使用callable然后使用[$obj,'myMethod']
我的类非常复杂,我不能仅仅为了一个闭包类型而改变任何东西。
所以我需要将一个方法转换为闭包。有没有别的办法或者我应该用这个?

$obj->myOtherMethod(function($msg) use($obj) {
    $obj->myMethod($msg);
});

我希望使用更少的内存和更少的资源消耗方式。有这样的解决办法吗?

bkhjykvo

bkhjykvo1#

从PHP 7.1开始,你可以用途:

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

从PHP 5.4开始,你可以用途:

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

但是在你的例子中,myMethod()接受一个参数,所以闭包应该被称为$closure($msg)

5gfr0r5j

5gfr0r5j2#

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

RFC:PHP RFC: First-class callable syntax

相关问题