所以我最近遇到了这个问题,并想就使用动态实例化的“其他”含义发表我的想法。
一方面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
,因为您不能使用这种方法来实例化新对象。
!