1

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

2 回答 2

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();
}

但实际上,与其节省一两行代码并试图变得聪明,不如使用显式赋值,因为它很容易理解,即使很无聊。如果你发现你的论点太多,无法一一打出,可能是你的论点太多了。

于 2012-07-30T07:31:55.483 回答
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) {}
}
于 2020-06-10T18:40:56.103 回答