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)