有什么办法可以简化PHP构造函数的参数?

问题描述 投票:1回答:2

当我想把值传递到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
    }
}
php constructor variable-assignment simplify
2个回答
4
投票
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();
}

但实际上,与其省下一两行代码,自作聪明,不如使用显式赋值,因为它很容易理解,即使很无聊。如果你发现你的论点太多,无法一个个打出来,也许你的论点太多。


0
投票

我知道这个问题很老了,其实这是一个重复的话题,但对于偶然进来的人来说,可能还是很有意思的。

PHP 5.6以上 你可以使用省略号 ... 所谓 溅射操作者.

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出来后,就不会那么乱了,因为你不再需要在赋值前声明属性了。

用你的代码,这个构造函数的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) {}
}

RFC

因此,它甚至会在与以下内容结合时更加有用 iterable. 不允许使用Splat操作符。请注意,这将只适用于构造函数。

class Rump {
    public function __construct(private iterable $vars) {}
}
© www.soinside.com 2019 - 2024. All rights reserved.