1

call_user_func_arrayいくつかのパラメーターに応じて動的な文字列引数を渡すobjectsメソッドを呼び出しています。

現在、次のようになっています。

<?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'AnotherObjectE_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 に答える