すべてのパラメーターを参照して可変数のパラメーターを受け取るPHP関数を作成することは可能ですか?
関数の合成と引数のバインドに取り組んでいるので、値の配列を参照で受け取る関数や、オブジェクトにラップされた引数を受け取る関数は役に立ちません。呼び出し時の参照渡しについても考えないでください。そのことさえ存在すべきではありません。
すべてのパラメーターを参照して可変数のパラメーターを受け取るPHP関数を作成することは可能ですか?
関数の合成と引数のバインドに取り組んでいるので、値の配列を参照で受け取る関数や、オブジェクトにラップされた引数を受け取る関数は役に立ちません。呼び出し時の参照渡しについても考えないでください。そのことさえ存在すべきではありません。
PHP 5.6では、参照渡しをサポートする新しい可変個引数構文が導入されました。(更新してくれた@outisに感謝します)
function foo(&...$args) {
$args[0] = 'bar';
}
PHP 5.5以下の場合、次のトリックを使用できます。
function foo(&$param0 = null, &$param1 = null, &$param2 = null, &$param3 = null, &$param4 = null, &$param5 = null) {
$argc = func_num_args();
for ($i = 0; $i < $argc; $i++) {
$name = 'param'.$i;
$params[] = & $$name;
}
// do something
}
欠点は、引数の数が定義された引数の数によって制限されることです(例のスニペットでは6)。しかし、func_num_args()を使用すると、さらに必要かどうかを検出できます。
とにかく、7つを超えるパラメーターを関数に渡すことは悪い習慣です;)
PHP 5.6では、参照渡しをサポートする新しい可変個引数構文が導入されています。関数の最後のパラメーターの前にを付けると、...
その時点以降の実際の引数を保持する配列として宣言されます。...
配列は、他のパラメーターの場合と同様に、トークンの前にさらに。を付け&
て、引数をref-by-refにすることで、参照を保持するように宣言できます。
例1:
function foo(&...$args) {
$args[0] = 'bar';
}
foo($a);
echo $a, "\n";
# output:
#a
例2:
function number(&...$args) {
foreach ($args as $k => &$v) {
$v = $k;
}
}
number($zero, $one, $two);
echo "$zero, $one, $two\n";
# output:
#0, 1, 2
オブジェクトにラップされたすべてのパラメーターを渡すことができるはずです。
Class A
{
public $var = 1;
}
function f($a)
{
$a->var = 2;
}
$o = new A;
printf("\$o->var: %s\n", $o->var);
f($o);
printf("\$o->var: %s\n", $o->var);
12を印刷する必要があります
可能です:
$test = 'foo';
$test2 = 'bar';
function test(){
$backtrace = debug_backtrace();
foreach($backtrace[0]['args'] as &$arg)
$arg .= 'baz';
}
test(&$test, &$test2);
ただし、これは非推奨の参照による呼び出し時パスを使用します。
編集:申し訳ありませんが、それらを参照にしたいとは思わなかったのですが……あなたがしなければならないのは、それらをオブジェクトとして渡すことだけです。
たとえば、それらを配列で渡すこともできます
myfunction(array('var1' => 'value1', 'var2' => 'value2'));
次に、関数であなたは単に
myfunction ($arguments) {
echo $arguments['var1'];
echo $arguments['var2'];
}
配列はネストすることもできます。