2016-10-24 147 views
1

我曾希望創建一種方法,通過這種方法,我可以通過引用「綁定」幾個變量,以便它們可以重新用於將新數據傳遞給對象,本質上執行與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(); 

我想是的輸出爲兩行寫着「右」,而不是「錯誤」。目前我實現這一目標使用以下討厭的解決方法綁定方法:

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

請注意,可變參數的參考參數可以在來電者的一​​側合作疼痛。事實上,你會發現很多問題,詢問如何動態調用mysqli_bind_param ... – deceze

回答

3

可變參數參數的語法引用是:

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

Example

+0

認真?呃,現在我覺得很蠢! – Haravikk