【问题标题】:Get PHP callable arguments as an array?将 PHP 可调用参数作为数组获取?
【发布时间】:2015-03-24 19:11:58
【问题描述】:

假设我有一个可调用的存储为变量:

$callable = function($foo = 'bar', $baz = ...) { return...; }

我如何获得'bar'?

if (is_callable($callable)) {
  return func_get_args();
}

可惜func_get_args()是针对当前函数的,能不能得到一个键值对的参数?

【问题讨论】:

    标签: php arguments callable-object


    【解决方案1】:

    你可以使用reflection:

    $f = new ReflectionFunction($callable);
    $params = $f->getParameters();
    echo $params[0]->getDefaultValue();
    

    【讨论】:

    • ReflectionFunction 是否适用于任何可调用对象? (比如类方法和静态方法?)
    • @SparK 不,它不起作用。这是我的情况。如果你还需要这个,可以看看我的回答。
    【解决方案2】:

    您可能希望使用get_defined_vars 来完成此操作,此函数将返回一个包含所有已定义变量的数组,特别是通过访问输出数组中的callable 索引。

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,因为我正在寻找可调用的参数,而不仅仅是函数本身。我的情况是

      class MyClass{
          public function f(){
              // do some stuff
          }
      }
      
      $myclass = new MyClass();
      $callable = array($myclass, "f);
      

      这是 php.ini 中的有效回调。在这种情况下,@Marek 给出的解决方案不起作用。

      我使用了 phps is_callable 函数。您可以使用第三个参数获取函数的名称。然后你必须检查你的回调是一个函数还是一个(类/对象)方法。否则Reflection-classes 会搞砸。

      if($callable instanceof Closure){
          $name = "";
          is_callable($callable, false, $name);
      
          if(strpos($name, "::") !== false){
              $r = new ReflectionMethod($name);
          }
          else{
              $r = new ReflectionFunction($name);
          }
      }
      else{
          $r = new ReflectionFunction($callable);
      }
      
      $parameters = $r->getParameters();
      // ...
      

      这也会为ReflectionFunctionAbstract::isStatic() 返回正确的值,即使$name 始终使用通常表示静态函数的::(有一些例外)。


      注意:在 PHP>=7.0 中,使用Closures 可能更容易。在那里你可以做一些类似的事情

      $closure = Closure::fromCallable($callable);
      
      $r = new ReflectionFunction($closure);
      

      您可能还需要区分ReflectionFunctionReflectionMethod,但我无法对此进行测试,因为我没有使用 PHP>=7.0。

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2021-12-15
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多