Я надеялся создать метод, с помощью которого я мог бы «привязать» несколько переменных по ссылке, чтобы их можно было повторно использовать для передачи новых данных объекту, по существу делая то же самое, что и метод PHP mysqli_stmt->bind_param()
.Variadic Variables по ссылке
Однако не представляется возможным указать, что переменные аргументы должны быть по ссылке, так как они всегда передаются по значению.
Для иллюстрации рассмотрим следующий пример:
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();
То, что я хочу, это выход на две линии говорят «Right», а не «Wrong». В настоящее время я достижение этой цели, используя следующий неприятный обходной путь для метода связывания:
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
в метод (поскольку он неверно истолкован как несуществующий аргумент).
Что мне интересно, есть ли другой способ, которым я могу достичь этого, который не настолько тяжелый?
Обратите внимание, что VARIADIC по ссылке параметры могут быть болью, чтобы работать с на стороне абонента. На самом деле вы найдете множество вопросов о том, как динамически вызывать 'mysqli_bind_param' ... – deceze