だから私は最近これに遭遇し、動的インスタンス化を使用することの「その他の」影響について考えを述べたいと思いました。
1 つのことfunc_get_args()
は、物事に少しレンチを投げます。たとえば、特定のクラス (ファクトリ メソッドなど) のコンストラクタとして機能するメソッドを作成したいとします。ファクトリ メソッドに渡されたパラメーターを、インスタンス化するクラスのコンストラクターに渡すことができる必要があります。
もしあなたがそうするなら:
public function myFactoryMethod()
{
$class = 'SomeClass'; // e.g. you'd get this from a switch statement
$obj = new $class( func_get_args() );
return $obj;
}
そして、次のように呼び出します。
$factory->myFactoryMethod('foo','bar');
実際には、最初/唯一のパラメーターとして配列を渡しています。これは、new SomeClass( array( 'foo', 'bar' ) )
これは明らかに私たちが望んでいるものではありません。
解決策(@Seldaekが指摘したように)では、配列をコンストラクターのパラメーターに変換する必要があります。
public function myFactoryMethod()
{
$class = 'SomeClass'; // e.g. you'd get this from a switch statement
$ref = new ReflectionClass( $class );
$obj = $ref->newInstanceArgs( func_get_args() );
return $obj;
}
注: このcall_user_func_array
アプローチを使用して新しいオブジェクトをインスタンス化することはできないため、これは を使用して達成できませんでした。
チッ!