我希望创建一种方法,通过这种方法,我可以“绑定”#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
的值传递给方法(因为它被误解为一个不存在的参数)。
我想知道的是,是否还有另一种方法可以实现这一目标,而不是那么重要吗?