回答:
配列に引数がある場合は、 call_user_func_array
関数に。
渡す引数の数が配列の長さに依存する場合は、おそらくそれらを配列にパックして、その引数をの2番目のパラメーターに使用できることを意味しますcall_user_func_array
。
渡した配列の要素は、関数によって個別のパラメーターとして受信されます。
たとえば、次の関数がある場合:
function test() {
var_dump(func_num_args());
var_dump(func_get_args());
}
次のように、パラメータを配列にパックできます。
$params = array(
10,
'glop',
'test',
);
そして、関数を呼び出します:
call_user_func_array('test', $params);
このコードは出力します:
int 3
array
0 => int 10
1 => string 'glop' (length=4)
2 => string 'test' (length=4)
つまり、3つのパラメータ。関数がこのように呼び出されたのとまったく同じです:
test(10, 'glop', 'test');
これはPHP 5.6.xで可能になりました、...演算子(一部の言語では演算子とも呼ばれます)を使用して、で。
例:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
foreach ( $intervals as $interval ) {
$dt->add( $interval );
}
return $dt;
}
addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ),
new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );
新しいPhp 5.6では、... operator
代わりにfunc_get_args()
。
したがって、これを使用すると、渡すすべてのパラメーターを取得できます。
function manyVars(...$params) {
var_dump($params);
}
PHP 5.6以降、可変引数リストは...
演算子で指定できます。
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something('this goes in first', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
ご覧のように、...
演算子は引数の変数リストを配列に収集します。
変数引数を別の関数に渡す必要がある場合...
でも、が役立ちます。
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else('this goes in first', 2, 3, 4, 5);
}
PHP 7以降では、引数の変数リストを強制的にすべて同じ型にすることもできます。
function do_something($first, int ...$all_the_others) { /**/ }
これを行う方法を探している人のために$object->method
:
call_user_func_array(array($object, 'method_name'), $array);
私は、これを変数パラメーターで変数method_nameを呼び出す構成関数で成功させました。
$object->method_name(...$array);
$object->method_name(&...$args);
あなたはそれを呼び出すことができます。
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
出力:
配列([0] => blah)配列([0] => blah [1] => blah)
配列の単純な受け渡しと抽出についてここで誰も言及していないことに私は驚いています。例えば:
function add($arr){
extract($arr, EXTR_REFS);
return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3
もちろん、これは引数の検証を提供しません。そのため、誰でも私の期待機能を使用できます:https : //gist.github.com/iautomation/8063fc78e9508ed427d5
古い質問ですが、ここでの回答はどれも、単に質問に答えるだけの良い仕事をするものではありません。
私はphpで遊んだところ、解決策は次のようになります。
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
この関数は2つのことを実行できます。
必要なパラメータのみで呼び出された場合:myFunction("Hi")
「Hi default」が出力されます
しかし、オプションのパラメーターを指定して呼び出された場合:myFunction("Hi","me")
「Hi me」と出力されます。
これが将来これを探しているすべての人に役立つことを願っています。
これは魔法のメソッド__invokeを使用した解決策です
(php 5.3以降で利用可能)
class Foo {
public function __invoke($method=null, $args=[]){
if($method){
return call_user_func_array([$this, $method], $args);
}
return false;
}
public function methodName($arg1, $arg2, $arg3){
}
}
同じクラス内から:
$this('methodName', ['arg1', 'arg2', 'arg3']);
オブジェクトのインスタンスから:
$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
call_user_func_array
に2009年のトップ投票の回答で述べられているように使用しています。多分__invoke
それを余分にラップする意味があるかもしれません-私はそれを見ません。