1

我正在调用一个对象方法,通过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 或者只是跳过调用?

4

1 回答 1

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;
  }
于 2012-09-05T20:06:09.023 回答