当我想将值传递到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;
}
}
或:
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();
}
但实际上,使用明确的赋值通常更可取,因为它很容易理解,即使很无聊。如果你发现你有太多的论点,无法一个接一个地打出来,也许你的论点太多了。
我知道这个问题很老了,实际上这是一个重复的话题,但对于偶然来到这里的人来说可能仍然很有趣。
由于PHP 5.6+,您可以使用省略号...
,称为Splat运算符。
function func(...$manyArgs) {
foreach ($manyArgs as $each) {
// do something with $each argument
}
}
RFC
或者,由于PHP 7.1存在一个名为iterable
的类型提示
function func(iterable $args) {
foreach ($args as $arg) {
// awesome stuff
}
}
RFC
一旦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) {}
}
RFC
因此,它与CCD_ 3的组合将更加有用。不允许使用飞溅操作员。请注意,这将仅适用于构造函数。
class Rump {
public function __construct(private iterable $vars) {}
}