【问题标题】:call_user_func_array to not accept unexpected function parameterscall_user_func_array 不接受意外的函数参数
【发布时间】:2015-03-07 16:21:26
【问题描述】:

我有一个不接受参数的函数,即function doSomething(){...}

如果我运行,call_user_func_array('doSomething', array('param1' => 'something')); 它不会返回错误。

我可以让它强制一个错误,比如“这个函数不应该接受参数”。

【问题讨论】:

  • 当然,只需通过func_num_args() 进行检查并在需要时抛出异常
  • 顺便说一句:您如何调用函数完全无关紧要,直接或使用call_user_func() 没有区别。

标签: php function argument-passing php-5.5


【解决方案1】:

完全有可能向用户定义的函数发送比函数签名定义的更多的参数。那是因为你可以在你的函数中使用额外的代码来处理这些,或者干脆忽略它们。

function doSomething(){
    if (func_num_args() > 0) {
        throw new Exception('Too many arguments');
    }
    ....
}

使用类似上面的方法来测试已经传递给你的函数的参数

【讨论】:

  • 我对此进行了研究,但是有很多功能,不必为所有功能都这样做会很棒。也许我可以在调用 call_user_func_array 之前检查接受参数的数量?
  • call_user_func_array('doSomething', array('param1' => 'something')); 不利于在实际调用中而不是事先定义数组时检查数组中的参数....但是为什么会出现这样的问题?如果是您的代码进行调用,那么您可以控制传递给函数的内容
  • 我想提醒用户该函数不接受参数。
  • 这是您为他人编写的库吗?如果是这样,识别可以传递的参数参数的良好文档有什么问题,以及任何其他参数都将被忽略的事实
  • 我相信,从 PHP 5.6 开始,函数现在实际上可以明确声明它们接受可变数量的参数,从而使使用 func_get_args() 的这种愚蠢的 hack 过时了。只是想提一下这个相关的小细节。
【解决方案2】:

你可以使用func_num_args:

function foo()
{
    $n = func_num_args();
    if ($n > 0) {
        echo "Number of arguments: $n, 0 expected.";
    return;
    }
}

foo(1, 2, 3);

::Info

【讨论】:

    【解决方案3】:

    查看ReflectionFunction 课程。使用它,您可以检测一个函数需要多少个参数,并避免在不匹配时调用它。

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多