2016-10-24 2 views
1

Я надеялся создать метод, с помощью которого я мог бы «привязать» несколько переменных по ссылке, чтобы их можно было повторно использовать для передачи новых данных объекту, по существу делая то же самое, что и метод 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 в метод (поскольку он неверно истолкован как несуществующий аргумент).

Что мне интересно, есть ли другой способ, которым я могу достичь этого, который не настолько тяжелый?

+0

Обратите внимание, что VARIADIC по ссылке параметры могут быть болью, чтобы работать с на стороне абонента. На самом деле вы найдете множество вопросов о том, как динамически вызывать 'mysqli_bind_param' ... – deceze

ответ

3

Синтаксис для параметров переменного числа по ссылке, является:

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

Example

+0

Серьезно? Га, теперь я чувствую себя глупо! – Haravikk

Смежные вопросы