任何简化PHP构造函数参数的方法


Any way to simplify PHP constructor arguments?

当我想将值传递到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) {}
}