#php
#php
Вопрос:
Я надеялся создать метод, с помощью которого я мог бы «привязать» несколько переменных по ссылке, чтобы их можно было повторно использовать для передачи новых данных объекту, по сути делая то же самое, что и mysqli_stmt->bind_param()
метод PHP.
Однако, похоже, невозможно указать, что аргументы variadic должны быть по ссылке, как таковые они всегда передаются по значению.
Для иллюстрации рассмотрим этот пример:
class MyType {
private $bound = [];
public function bind(...$vars) {
$this->bound = [];
foreach ($vars as amp;$v) { $this->bound[] = amp;$v; }
}
public function echo() {
foreach ($this->bound as $v) { echo "$vn"; }
}
}
$a = 'Wrong'; $b = 'Wrong'; $t = new MyType();
$t->bind($a, $b);
$a = 'Right'; $b = 'Right';
$t->echo();
Я хочу, чтобы на выходе было две строки с надписью «Правильно», а не «Неправильно». В настоящее время я добиваюсь этого, используя следующий неприятный обходной путь для метода bind:
public function bind(amp;$var0, amp;$var1 = null, amp;$var2 = null, amp;$var3 = null, ...$overflow) {
if (!empty($overflow)) { throw new Exception('Too many arguments'); }
$this->bound = [amp;$var0];
if ($var1 === null) { return; }
$this->bound[] = amp;$var1;
if ($var2 === null) { return; }
$this->bound[] = amp;$var2;
if ($var3 === null) { return; }
$this->bound[] = amp;$var3;
}
Но, очевидно, это ограничивает меня только количеством переменных, которые я готов определить. Это также имеет побочный эффект, заключающийся в том, что я не могу передавать значения null
в метод (поскольку это неверно интерпретируется как несуществующий аргумент).
Мне интересно, есть ли другой способ добиться этого, который не был бы таким шаблонным?
Комментарии:
1. Обратите внимание, что с параметрами с переменными по ссылке может быть сложно работать на стороне вызывающего. На самом деле вы найдете множество вопросов, спрашивающих, как динамически вызывать
mysqli_bind_param
…
Ответ №1:
Синтаксис для переменных параметров по ссылке таков:
public function bind(amp;...$vars) {
....
}