2010-12-11 57 views
1

实例化一个新的类实例时在Python中,你可以打包和解包,像这样的论点:参数打包和解包在PHP

def myfunction(arg1, arg2, arg3): 
    pass 

mydict = dict(arg1='foo', arg2='bar', arg3='baz') 

myfunction(**mydict) 

mylist = ['foo', 'bar', 'baz'] 

myfunction(*mylist) 

现在,有在PHP中类似的东西?我有一个传递给函数的类,以及从数据库记录中提取的关联数组。我想创建一个类的实例,它接受与数组中的键相同的参数。可以做到吗?

编辑

好了,我肯定没有正确地制定我的问题。我想动态地实例化一个新的类,当我事先不知道类名和参数的数目时。

我已经找到了答案,但:

http://php.net/manual/en/book.reflection.php

这里的解决方案:

class MyClass { 
    public function __construct($var1, $var2, $var3) { 
     echo "$var1\n"; 
     echo "$var2\n"; 
     echo "$var3\n"; 
    } 
} 

$reflector = new ReflectionClass('MyClass'); 
$args = array('var1'=>'foo', 'var2'=>'baz', 'var3'=>'bar'); 
$instance = $reflector->newInstanceArgs($args); 

回答

2

不,你不能直接这样做,你就必须手动提取值从数组中传递,并将它们传递给构造函数,或将其更改为使其接受数组作为参数。

你可能会看看call_user_func_array但我不认为你可以使用它与一个构造函数,因为你需要一个对象的实例来调用它的一个方法。

+0

这是我过去所做的。只需将数组传递给该函数(只要该函数允许) – Matthew 2010-12-11 14:42:50

1

注意,帕拉姆列表拆包myfunc(*args)可以call_user_func_array()实现:

$args = array("foo", "bar", "baz"); 

call_user_func_array("myfunc", $args); 

对于对象的方法,你可以使用call_user_func_array(array($obj, "__construct"), $args)。这里的缺点是__constructor因此会被调用两次,所以不应该做任何有趣的事情。否则,需要一个特定的init方法。

由于缺少命名参数,因此在PHP中不存在等效于myfunc(**args)的值。因此,一个常见的习惯用法是将dict /数组传入,并让函数处理名为params。

+0

在call_user_func_array()的注释中,有一些非常好的替代方案可用于在函数上执行此操作,而不仅仅用于类,如Damin的注释。 – gaborous 2015-04-21 14:26:02