7

どのように機能するかのように、引数のインデックス付き配列をメソッドに渡すことができるようにする必要がある何かに取り組んでいますcall_user_func_array。私は使用しますcall_user_func_arrayが、それは望ましくないOOPアプローチではなく、メソッドを静的にする必要があり、ターゲットクラスのOOを壊します。

私は使用しようとしましReflectionClassたが、役に立ちませんでした。クラスのメソッドに引数を呼び出すことはできません。コンストラクターのみです。残念ながら、これは望ましくありません。

だから私はmanページを見て見ましReflectionFunctionたが、クラスをインスタンス化し、それをメソッドにポイントしてからそれを使用する方法はありませんinvokeArgs.

使用例ReflectionFunction(覚えておいてください、この質問はPHP 5.4とタグ付けされているため、構文です):

$call = new \ReflectionFunction( "(ExampleClass())->exampleMethod" );
$call->invokeArgs( ["argument1", "argument2"] );

これは次の場合に失敗します。

Function (Index())->Index() does not exist

使用例ReflectionMethod

$call = new \ReflectionMethod( "ExampleClass", "exampleMethod" );
$call->invokeArgs( new ExampleClass(), ["argument1", "argument2"] );
print_r( $call );

これは次の場合に失敗します。

ReflectionMethod Object
(
    [name] => Index
    [class] => Index
)

引数がメソッドに渡されることはありません。

望ましい結果は次のとおりです。

class ExampleClass() {
    public function exampleMethod( $exampleArg1, $exampleArg2 ){
        // do something here
        echo "Argument 1: {$exampleArg1}\n";
        echo "Argument 2: {$exampleArg2}\n";
    }
}

$array = [ 'exampleArg1Value', 'exampleArg2Value' ];

$arrayのインスタンスに渡した場合ExampleClass->exampleMethod()、引数は 1 つだけで、配列になります。代わりに、個々の引数を取得できる必要があります。

呼び寄せる方法があれば、船の形で途中でやろうかなと思っていたReflectorFunctionReflectorClassですが、無理そうです。

以前にこれを達成するために使用したものはありますか?

4

3 に答える 3

6

私の知る限り、次のように動作するはずです:

$call = new \ReflectionMethod( "ExampleClass", "exampleMethod" );
$call->invokeArgs( new ExampleClass(), ["argument1", "argument2"] );
print_r( $call );

PHP のマイナーバージョンは何ですか? 5.4.7 を使用していますか?

于 2012-09-27T19:58:54.783 に答える
3

なんらかの理由で、どこかで何かが動かなくなった。

$call = new \ReflectionMethod( "ExampleClass", "exampleMethod" );
$call->invokeArgs( new ExampleClass(), ["argument1", "argument2"] );

今戻ります

Argument 1: argument1
Argument 2: argument2

問題の再現を試みます。これは、php-cliとfpmを使用した新しいphp5.4.7インストールにあります。

于 2012-09-28T13:49:12.787 に答える
3

私は独自の依存性インジェクターを作成し、パラメーターを使用してクラスを動的に構築しました。ここにあなたの行くべきいくつかのコードがあります:

$type = 'ExampleClass';

$reflector = new \ReflectionClass( $type );

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

$constructor = $reflector->getConstructor();

$parameters = $constructor->getParameters();

この時点で、構築に必要なパラメーターの配列が得られます。パラメータを値に置き換えて、クラスを構築できるようになりました。

于 2012-09-27T20:24:19.903 に答える