当我想把值传递到PHP构造函数中时,我不得不去。
class Rump {
private $var1;
private $var2;
private $var3;
public function __construct($var1, $var2, $var3) {
$this->var1 = $var1;
$this->var2 = $var2;
$this->var3 = $var3;
}
}
有没有更简单的方法?
class Rump {
public function __construct($var1, $var2, $var3) {
//call a function here
}
}
public function __construct($var1, $var2, $var3) {
foreach (array('var1', 'var2', 'var3') as $var) {
$this->$var = $$var;
}
}
or:
public function __construct() {
foreach (array('var1', 'var2', 'var3') as $i => $var) {
$this->$var = func_get_arg($i);
}
}
or:
public function __construct() {
list($this->var1, $this->var2, $this->var3) = func_get_args();
}
但实际上,与其省下一两行代码,自作聪明,不如使用显式赋值,因为它很容易理解,即使很无聊。如果你发现你的论点太多,无法一个个打出来,也许你的论点太多。
我知道这个问题很老了,其实这是一个重复的话题,但对于偶然进来的人来说,可能还是很有意思的。
自 PHP 5.6以上 你可以使用省略号 ...
所谓 溅射操作者.
function func(...$manyArgs) {
foreach ($manyArgs as $each) {
// do something with $each argument
}
}
或自 PHP 7.1 存在一个类型提示,叫做 iterable
function func(iterable $args) {
foreach ($args as $arg) {
// awesome stuff
}
}
很快,PHP 8出来后,就不会那么乱了,因为你不再需要在赋值前声明属性了。
用你的代码,这个构造函数的boilerplate。
class Rump {
private $var1;
private $var2;
private $var3;
public function __construct($var1, $var2, $var3) {
$this->var1 = $var1;
$this->var2 = $var2;
$this->var3 = $var3;
}
}
很快就会被缩短为
class Rump {
public function __construct(
private $var1,
private $var2,
private $var3) {}
}
因此,它甚至会在与以下内容结合时更加有用 iterable
. 不允许使用Splat操作符。请注意,这将只适用于构造函数。
class Rump {
public function __construct(private iterable $vars) {}
}