有什么方法可以简化PHP构造函数参数吗?

时间:2012-07-30 07:24:34

标签: php constructor variable-assignment simplify

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

2 个答案:

答案 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 
    }
}

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

因此,与iterable结合使用时,它将更加有用。不允许使用Splat运算符。请注意,这仅适用于构造函数。

class Rump {
    public function __construct(private iterable $vars) {}
}