我有以下课程:
class Foo {
public function __construct($id, $name, $value) {}
}
我想使用数组中的变量初始化此类,例如:
$arr = array(1, 'some name', 'some value');
$fooObj = new Foo($arr);
它应该像j6中的ES6传播运算符一样工作:
callFunc(...arr);
这可能吗?
答案 0 :(得分:3)
在PHP> = 5.6.0中,当您使用...
显示JavaScipt时使用argument unpacking:
$fooObj = new Foo(...$arr);
对于以前的版本,您可以使用call_user_func_array()
,但遗憾的是,不会实例化对象并传递给构造函数。
根据deceze,您可以使用ReflectionClass::newInstanceArgs来实例化您的对象:
$class = new ReflectionClass('Foo');
$fooObj = $class->newInstanceArgs($arr);
答案 1 :(得分:-2)
spread运算符允许您传递参数列表,该函数将这些参数作为数组。在 PHP 中,您可以使用变量参数列表运算符“...
”。
http://docs.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
示例:
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
使用您的示例:
class Foo {
var $id;
var $name;
var $value;
public function __construct(...$params) {
$this->id=$params[0];
$this->name=$params[1];
$this->value=$params[2];
}
}
然后致电:
$var=new Foo(1, 'some name', 'some value');
在您的情况下,您尝试将一组参数传递给函数。在这种情况下,您可以省略“...”运算符并传递元素:
class Foo {
var $id;
var $name;
var $value;
public function __construct($params) {
$this->id=$params[0];
$this->name=$params[1];
$this->value=$params[2];
}
}
然后致电:
$arr = array(1, 'some name', 'some value');
$fooObj = new Foo($arr);