确定call_user_func_array的参数

时间:2012-09-05 20:01:25

标签: php oop

我正在通过call_user_func_array调用一个对象方法,我根据几个参数传递动态字符串参数。

目前看起来与此相似:

<?php
class MyObject
{
     public function do_Procedure ($arg1 = "", $arg2 = "")
     { /* do whatever */ }


     public function do_Something_Else (AnotherObject $arg1 = null)
     { /* This method requires the first parameter to
          be an instance of AnotherObject and not String */ }
}

call_user_func_array(array($object, $method), $arguments);
?>

这适用于方法$method = 'do_Procedure',但如果我想调用$method = 'do_Something_Else'方法,该方法要求第一个参数是AnotherObject的实例,则会出现E_RECOVERABLE_ERROR错误。

我如何知道应该传递哪种类型的实例?例如。如果此方法需要一个对象实例,但第一个处理过的参数是字符串,我如何识别这个,以便我可以传递null或者只是跳过调用?

1 个答案:

答案 0 :(得分:2)

$ arguments是一个会爆炸到函数参数的数组。如果调用do_Something_Else函数,则数组必须为空或第一个元素必须为null或AnotherObject的实例

在所有其他情况下,您会收到E_RECOVERABLE_ERROR错误。

要找出需要传递的参数,可以使用Reflectionclass

示例,需要一些工作来调整你的需求:

  protected function Build( $type, $parameters = array( ) )
  {
    if ( $type instanceof \Closure )
      return call_user_func_array( $type, $parameters );

    $reflector = new \ReflectionClass( $type );

    if ( !$reflector->isInstantiable() )
      throw new \Exception( "Resolution target [$type] is not instantiable." );

    $constructor = $reflector->getConstructor();

    if ( is_null( $constructor ) )
      return new $type;

    if( count( $parameters ))
      $dependencies = $parameters; 
    else 
      $dependencies = $this->Dependencies( $constructor->getParameters() );

    return $reflector->newInstanceArgs( $dependencies );
  }

  protected static function Dependencies( $parameters )
  {
    $dependencies = array( );

    foreach ( $parameters as $parameter ) {
      $dependency = $parameter->getClass();

      if ( is_null( $dependency ) ) {
        throw new \Exception( "Unresolvable dependency resolving [$parameter]." );
      }

      $dependencies[] = $this->Resolve( $dependency->name );
    }

    return ( array ) $dependencies;
  }