当我想将值传递给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
}
}
答案 0 :(得分:4)
public function __construct($var1, $var2, $var3) {
foreach (array('var1', 'var2', 'var3') as $var) {
$this->$var = $$var;
}
}
或:
public function __construct() {
foreach (array('var1', 'var2', 'var3') as $i => $var) {
$this->$var = func_get_arg($i);
}
}
或:
public function __construct() {
list($this->var1, $this->var2, $this->var3) = func_get_args();
}
但实际上,通常首选使用显式赋值而不是保存一两行并试图变得聪明,因为它很容易理解,即使很无聊。如果你发现有太多的参数要逐一输入,也许你的论点太多了。
答案 1 :(得分:0)
我知道这个问题很旧,实际上是一个重复的话题,但对于那些偶然发现这里的人来说仍然很有趣。
自 PHP 5.6 + 起,您可以使用称为 Splat运算符的省略号...
。
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发布,很快就会变得一团糟,因为您不再需要在赋值之前声明属性。
使用您的代码,此构造函数样板:
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) {}
}