参考变量的变量

时间:2016-10-24 12:07:00

标签: php

我希望创建一种方法,通过这种方法,我可以“绑定”#34;通过引用的几个变量,使得它们可以被重用以将新数据传递给对象,基本上做与PHP mysqli_stmt->bind_param()方法相同的事情。

但是,似乎无法通过引用指定可变参数,因为它们总是按值传递。

为了说明,请考虑以下示例:

class MyType {
    private $bound = [];
    public function bind(...$vars) {
        $this->bound = [];
        foreach ($vars as &$v) { $this->bound[] = &$v; }
    }
    public function echo() {
        foreach ($this->bound as $v) { echo "$v\n"; }
    }
}

$a = 'Wrong'; $b = 'Wrong'; $t = new MyType();
$t->bind($a, $b);
$a = 'Right'; $b = 'Right';
$t->echo();

我想要的是输出是两行说"右"而不是"错误"。目前,我使用以下针对bind方法的讨厌的解决方法来实现此目的:

public function bind(&$var0, &$var1 = null, &$var2 = null, &$var3 = null, ...$overflow) {
    if (!empty($overflow)) { throw new Exception('Too many arguments'); }

    $this->bound = [&$var0];

    if ($var1 === null) { return; }
    $this->bound[] = &$var1;

    if ($var2 === null) { return; }
    $this->bound[] = &$var2;

    if ($var3 === null) { return; }
    $this->bound[] = &$var3;
}

但显然这只限制了我愿意定义的变量数量。这也有副作用,我无法将null的值传递给方法(因为它被误解为一个不存在的参数)。

我想知道的是,是否还有另一种方法可以实现这一目标,而不是那么重要吗?

1 个答案:

答案 0 :(得分:3)

通过引用的可变参数的语法是:

public function bind(&...$vars) {
    ....
}

Example