2016-10-24 6 views
1

私は、オブジェクトに新しいデータを渡すために再利用できるように、いくつかの変数を参照によって「バインド」できる方法を作りたいと考えていました。これはPHPのmysqli_stmt->bind_param()メソッドと同じことです。Variadic Variables by Reference

しかし、可変引数が参照であるべきことを指定することは可能ではないように見えます。つまり、常に値によって渡されます。この例を考え、説明するために

:出力ではなく、「間違った」よりも、「右」と言って二行であるためには

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; 
} 

をしかし、明らかに、これは私が定義して喜んで変数の数だけに私を制限しています。現在、私は、bindメソッドのために、以下の厄介な回避策を使用してこれを達成しています。これには、nullの値をメソッドに渡すことができないという副作用があります(存在しない引数として誤って解釈されるため)。

これは私がこれを達成できる別の方法があるかどうかです、それはあまり定型的ではありません?参照による

+0

注意してください。実際に 'mysqli_bind_param'を動的に呼び出す方法を尋ねる質問がたくさんあります。 – deceze

答えて

3

可変引数パラメータの構文は次のとおりです。可変長参照によるパラメータは、発信者の側で動作するように痛みをすることができることを

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

Example

+0

真剣に?ガー、今私は愚かだと感じる! – Haravikk