PHP中实例化新类时的参数打包与解包

1 投票
2 回答
1489 浏览
提问于 2025-04-16 08:23

在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 这个函数,但我觉得你不能用它来调用构造函数,因为你需要一个对象的实例才能调用它的方法。

撰写回答