webentwicklung-frage-antwort-db.com.de

So übergeben Sie eine variable Anzahl von Argumenten an eine PHP Funktion

Ich habe eine PHP Funktion, die eine variable Anzahl von Argumenten akzeptiert (mit func_num_args() und func_get_args()), aber die Anzahl der Argumente, die ich übergeben möchte Funktion hängt von der Länge eines Arrays ab. Gibt es eine Möglichkeit, call a PHP function mit einer variablen Anzahl von Argumenten?

110
nohat

Wenn Sie Ihre Argumente in einem Array haben, könnte Sie die Funktion call_user_func_array interessieren.

Wenn die Anzahl der zu übergebenden Argumente von der Länge eines Arrays abhängt, können Sie sie wahrscheinlich selbst in ein Array packen - und dieses für den zweiten Parameter von call_user_func_array Verwenden.

Elemente dieses Arrays, die Sie übergeben, werden dann von Ihrer Funktion als unterschiedliche Parameter empfangen.


Zum Beispiel, wenn Sie diese Funktion haben:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}

Sie können Ihre Parameter wie folgt in ein Array packen:

$params = array(
  10,
  'glop',
  'test',
);

Rufen Sie dann die Funktion auf:

call_user_func_array('test', $params);

Dieser Code wird die Ausgabe:

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)

dh 3 Parameter; Genau wie iof wurde die Funktion folgendermaßen aufgerufen:

test(10, 'glop', 'test');
124
Pascal MARTIN

Dies ist jetzt möglich mit PHP 5.6.x mit dem Operator ... (in einigen Sprachen auch als splat-Operator bekannt):

Beispiel:

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' ) );
56
JCM

In einem neuen Php 5.6 können Sie ... operator Anstelle von func_get_args() verwenden. .

Auf diese Weise können Sie alle Parameter abrufen, die Sie übergeben:

function manyVars(...$params) {
   var_dump($params);
}
44
Salvador Dali

Seit PHP 5.6 kann mit dem Operator ... Eine Liste variabler Argumente angegeben werden.

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)
#> }

Wie Sie sehen, sammelt der Operator ... Die Variablenliste der Argumente in einem Array.

Wenn Sie die Variablenargumente an eine andere Funktion übergeben müssen, kann Ihnen das ... Weiterhin helfen.

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);
}

Seit PHP 7 kann die Liste der variablen Argumente gezwungen werden, alle des gleichen Typs zu sein.

function do_something($first, int ...$all_the_others) { /**/ }
37
Daniele Orlando

Für diejenigen, die nach einer Möglichkeit suchen, dies mit $object->method Zu tun:

call_user_func_array(array($object, 'method_name'), $array);

Dies gelang mir in einer Konstruktfunktion, die eine Variable method_name mit variablen Parametern aufruft.

10
danilo

Sie können es einfach anrufen.

function test(){        
     print_r(func_get_args());
}

test("blah");
test("blah","blah");

Ausgabe:

Array ([0] => blah) Array ([0] => blah [1] => blah)

4
Donnie C

Ich bin überrascht, dass hier niemand erwähnt hat, dass einfach ein Array übergeben und Auszug werden muss. Z.B:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3

Dies liefert natürlich nicht Argumentvalidierung . Dafür kann jeder meine Expect-Funktion verwenden: https://Gist.github.com/iautomation/8063fc78e9508ed427d5

2
iautomation

Eine alte Frage, ich weiß jedoch, keine der Antworten hier macht wirklich gute Arbeit, einfach die Frage zu beantworten.

Ich habe gerade mit PHP rumgespielt und die Lösung sieht so aus:

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}

Diese Funktion kann zwei Dinge tun:

Wenn es nur mit dem erforderlichen Parameter aufgerufen wird: myFunction("Hi") Es wird "Hi default" ausgegeben

Wird es aber mit dem optionalen Parameter aufgerufen: myFunction("Hi","me") Es wird "Hi me" ausgegeben;

Ich hoffe, das hilft jedem, der dies später sucht.

1
Alex

Hier ist eine Lösung mit der magischen Methode __invoke

(Verfügbar seit 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){

    }
}

Aus derselben Klasse heraus:

$this('methodName', ['arg1', 'arg2', 'arg3']);

Aus einer Instanz eines Objekts:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
0
Dieter Gribnitz