PHP中实例化新类时的参数打包与解包
在Python中,你可以这样打包和解包参数:
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 个回答
0
注意,参数列表解包 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 会被调用两次,所以不应该在这里做一些复杂的事情。否则,就需要一个专门的初始化方法。
由于 PHP 没有命名参数,所以没有与 myfunc(**args)
等效的写法。因此,常见的做法是直接把字典/数组传进去,让函数自己处理命名参数。
0
不,你不能直接这样做。你需要手动从数组中提取值,然后把这些值传递给构造函数,或者修改构造函数,让它可以接受一个数组作为参数。
你可以看看 call_user_func_array 这个函数,但我觉得你不能用它来调用构造函数,因为你需要一个对象的实例才能调用它的方法。