【问题标题】:php call a class method from a callback parameterphp从回调参数调用类方法
【发布时间】:2016-01-30 16:47:10
【问题描述】:

我想从 A 类实现一个回调,其中包含特定方法作为参数。例如。

    call_user_func_array($callback, ['$this->get', '$this->post']);

但是这不起作用。我的目标是这样做:

index.php

    $API = new API();
    $API->state('/users', function ($get, $post) {
        $get('/', 'UserController.getAll');
    });

API.php

    public function state ($state, $callback) {
        call_user_func_array($callback, ['$this->get', '$this->post']);
    }

    public method get ($uri, $ctrl)  { echo 'getting'; }
    public method post ($uri, $ctrl) { echo 'posting'; }

感谢您的任何意见! 我确实意识到使用 $this-> 方法,因为 $this-> 不会在回调范围内存在。

【问题讨论】:

  • 我的PHP版本是5.5.12

标签: php class parameters callback


【解决方案1】:

因为您使用对象方法而不是全局函数作为回调,所以您必须使用call_user_method_array 而不是call_user_func_array

【讨论】:

  • 这会给我注释:只有变量可以作为参数传回。阅读后我可以看到它已被弃用,并在 php 7 中完全删除
  • call_user_method_array 自 PHP 4.1.0 起已弃用,并已随 PHP 7 移除。
  • 正如我在 php 文档中看到的,call_user_method_array 已被弃用;你现在应该使用call_user_func_array(array($this, $callback), $params);
  • 你应该再次阅读文档,第一个参数应该是一个可调用变量。不是数组。
  • 现在我觉得很愚蠢,我应该说的是:“我得到错误:()期望参数1是一个有效的回调,第二个数组成员不是一个有效的方法”
【解决方案2】:

如果您只需要访问公共成员和方法,那么一种可能的解决方案是:

class API{
  public function state ($state, $callback) {
      call_user_func($callback, $this);
  }

  public function get ($uri, $ctrl)  { echo 'getting'; }
  public function post ($uri, $ctrl) { echo 'posting'; }
}

$API = new API();
$API->state('/users', function ($context) {
    $context->get('/', 'UserController.getAll');
});

【讨论】:

  • 如果我想这样做,只需将 $API 添加到函数范围内而不是在类范围内包含 this 变量会更容易。
【解决方案3】:

我发现我必须以某种方式将 $this 绑定到正确的范围。 我设法通过在每个参数中包含 $this(类即时)来做到这一点:

call_user_func_array($callback, [ [$this, 'get'] ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2018-04-03
    • 2011-01-18
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多