【问题标题】:Bind closure to class method将闭包绑定到类方法
【发布时间】:2015-06-25 15:56:26
【问题描述】:

我有函数式和 python 背景,现在我正在尝试 PHP。 我想做这样的事情:

    <?php

class Test
{

    function __construct($func)
    {
        $this->build = $func;
    }


}

$test = new Test(function(){echo "neco";});
$test->build();

//my result
//Fatal error: Call to undefined method Test::build() in C:\Install\web\php\test.php on line 15


?>

但正如您所见,我收到错误消息。有没有办法用依赖于参数作为php闭包的方法来实现类?

【问题讨论】:

标签: php functional-programming closures


【解决方案1】:

是的,您可以使用 __invoke() 执行此操作,只需像这样使用它:

$test->build->__invoke();

输出:

neco

【讨论】:

  • 我喜欢这个答案而不是@cristik 的答案,因为它直接回答了这个问题。
  • 其实我觉得我的效果更好,因为开发人员可以简单地写$test-&gt;build(),而不是额外的间接级别。
  • 我同意。我正在尝试使用最少的代码:) 顺便说一句,我必须像这样改进您的代码“return call_user_func_array($this->{$name}, $arguments);”或者,如果我需要它,它不会返回任何值:)
【解决方案2】:

您可以通过在 Test 类中实现魔术函数 __call() 来实现这一点。

__call() 在调用不可访问的方法时被触发 对象上下文。

public function __call($name, $arguments) {
    if($name === 'build') {
      $this->build();
    }
}

或者,使用_call(),以及动态调度:

public function __call($name, $arguments) {
    call_user_func_array($this->{$name}, $arguments);
}

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2011-04-07
    • 1970-01-01
    • 2018-05-27
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多