Итак, я недавно столкнулся с этим и хотел высказать свои мысли о «других» последствиях использования динамической реализации.
С одной стороны, 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;
}
, а затем позвоните:
$ заводской> myFactoryMethod ( 'Foo', 'бар');
Вы фактически передаете массив как первый / единственный параметр, который совпадает с 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
, поскольку вы не можете использовать этот подход для создания новых объектов.
НТН!