unoh.github.com

PHPで可変個の参照渡し

Sun Jul 30 21:16:22 -0700 2006

こんにちは,ttsuruoka です.

PHP では func_get_args() を使って可変個引数の関数を作ることができます.

function execute()
{
    $args = func_get_args()
    ....
}
execute($foo);
execute($foo, $bar);


しかしこれには問題があって,参照渡しができません.

function execute()
{
    $args = func_get_args();
    $args[0] = 20;
}
$foo = 10;
execute(&$foo);
echo $foo; // 10



func_get_args() が機能しないので,
可変個引数で参照渡しをすることはあきらめて,
array を使って実装します.

function execute($a)
{
    // foreach 文では参照が渡せないため for 文
    for ($i = 0; $i < count($a); $i++) {
        $a[$i] = ....
    }
}
execute(array(&$foo, &$bar));



これで可変個を渡すことができますが,
ひとつしか渡さない場合に

execute(array(&$foo));


と書くのは面倒なので下のようにします.

function execute($a)
{
    $t = !is_array($a) ? array(&$a) : $a;

    for ($i = 0; $i < count($t); $i++) {
        $t[$i] = ....
    }
}
execute(&$foo);
execute(array(&$foo, &$bar));


ここで可変個の参照を渡せる関数にこだわるのをやめて,
引数登録用の register メソッドを用意します.

class MyClass
{
    var $objs = array();
    
    function register(&$obj)
    {
        $this->objs[] = &$obj;
    }
    
    function execute()
    {
        $n = count($this->objs);
        for ($i = 0; $i < $n; $i++) {
            $this->objs[$i] = ....
        }
    }
}
$c = new MyClass;
$c->register($foo);
$c->register($bar);
$c->execute();


めでたしめでたし.

(注:環境は PHP4)