【问题标题】:Convert a PHP method to a closure将 PHP 方法转换为闭包
【发布时间】:2017-01-17 15:50:17
【问题描述】:

有没有办法在 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);
});

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

【问题讨论】:

  • Closures 没有性能问题。您可以使用您的试用版。这样做是可以的。
  • 关于use a less memory 的小注释。 php $var1 = $var2; 中的每个副本首先是一个参考,只要内容没有改变。这是直接复制$var1 = trim($var2);
  • 谢谢,你的意思是没有别的办法了?
  • 如果你的classmethod需要一个Closure作为参数,那么这里使用function($arg) use($obj){ }就可以了,你不必在这里考虑performance,在这种情况下它只是micro-optimizations .也许还有另一种方法,但只要你不想改变你的班级,这是我最好的解决方案,使用Closures。既然你这里只有一个例子,我只能给出一个一般性的答案。

标签: php oop callback


【解决方案1】:

从 PHP 7.1 开始,您可以使用:

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

从 PHP 5.4 开始,您可以使用:

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

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

$closure($msg)

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 2018-03-07
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 2011-01-15
      • 2013-11-02
      • 2015-11-23
      • 1970-01-01
      相关资源
      最近更新 更多