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)