Переменные по ссылке

#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) {
    ....
}
  

Пример