【问题标题】:How to use call_user_func with params?如何将 call_user_func 与参数一起使用?
【发布时间】:2015-06-07 23:50:11
【问题描述】:

我从没想过会遇到这个问题,但我无法独自在这里找到方法。

我有一个映射器数组,其中的键应该(或调用)是函数。 但是我一直都遇到这个错误:

call_user_func() 期望参数 1 是一个有效的回调

class Myclass
{
  protected static $_mapper = array(
        'setFuncA' => 'somethingWithA',
        'setFuncB' => 'somethingWithB'
    );

    public function getData() {
        $params = $this->getRequest()->getParams();

       // $params looks like
       // array('somethingWithA' => 'someValue')

        foreach ($params as $key => $value) {
            if (in_array($key, self::$_mapper)) {
                call_user_func(key(self::$_mapper), $params); // e.g. call_user_func('setFuncA', 'somethingWithA')
            }
        }
        // do something;
    }

    public function somethingWithA($args) {
        // do something
    }
}

我在这里缺少什么?我也用 call_user_func_array() 试过了,但也出错了。

已解决
好的,找到了我的问题。
我不得不打电话

call_user_func(array($this, key(self::$_mapper)), $params);

这终于奏效了。
但是我仍然不知道为什么我必须添加“$this”并用数组封装它。

【问题讨论】:

  • 尝试创建一个返回return key(self::$_mapper);的函数
  • call_user_func 不会检查它是否从类方法中调用。所以你必须提供上下文。这就是为什么您需要在数组中添加$this。查看manual 的可调用对象。
  • "但是我仍然不知道为什么我必须添加 "$this" 并用数组封装它。" - 解释器不知道应该调用给定方法的对象。

标签: arrays function callback


【解决方案1】:
class Myclass
{
  protected static $_mapper = array(
        'setFuncA' => 'somethingWithA',
        'setFuncB' => 'somethingWithB'
    );

    public function getData() {
        $params = $this->getRequest()->getParams();

       // $params looks like
       // array('somethingWithA' => 'someValue')

        foreach ($params as $key => $value) {
            if (in_array($key, self::$_mapper)) {
                call_user_func_array('myExtraFunc', $params);
            }
        }
        // do something;
    }

    public function somethingWithA($args) {
        // do something
    }

    public static function myExtraFunc() {
         return key(self::$_mapper);
    }
}

【讨论】:

  • 谢谢 Djaman,但当我调试该行时它返回相同的错误消息。
猜你喜欢
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多