Jak przekazać zmienną liczbę argumentów do funkcji PHP

Mam funkcję PHP, która pobiera zmienną liczbę argumentów( używając func_num_args() i func_get_args()), ale liczba argumentów, które chcę przekazać funkcji zależy od długości tablicy. Czy istnieje sposób na wywołanie funkcji PHP ze zmienną liczbą argumentów?

Author: nohat, 2009-09-14

9 answers

Jeśli masz swoje argumenty w tablicy, może Cię zainteresować call_user_func_array funkcja.

Jeśli liczba argumentów, które chcesz przekazać, zależy od długości tablicy, prawdopodobnie oznacza to, że możesz spakować je do tablicy-i użyć tej dla drugiego parametru call_user_func_array.

Elementy przekazywanej tablicy zostaną następnie odebrane przez funkcję jako odrębne parametry.


Na przykład, jeśli masz tę funkcję :

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

Możesz spakować swoje parametry do tablicy, tak:

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

I wywołujemy funkcję:

call_user_func_array('test', $params);

Ten kod spowoduje wyjście:

int 3

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

Ie, 3 parametry; dokładnie tak jak IOF funkcja została wywołana w ten sposób:

test(10, 'glop', 'test');
 132
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 16:44:40

Jest to teraz możliwe dzięki PHP 5.6.x , używając.. operator (znany również jako operator splat w niektórych językach):

Przykład:

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' ) );
 60
Author: jonathancardoso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 17:22:52

W Nowym Php 5.6, możesz użyć ... operator zamiast func_get_args().

Więc, używając tego, możesz uzyskać wszystkie parametry, które przekazujesz:

function manyVars(...$params) {
   var_dump($params);
}
 48
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 06:11:48

Od PHP 5.6, zmienna lista argumentów może być określona za pomocą operatora ....

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

Jak widać, operator ... zbiera listę zmiennych z argumentami w tablicy.

Jeśli chcesz przekazać argumenty zmiennej do innej funkcji, ... nadal może Ci pomóc.

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

Ponieważ PHP 7 , lista zmiennych argumentów może być również wszystkich tego samego typu.

function do_something($first, int ...$all_the_others) { /**/ }
 42
Author: Daniele Orlando,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 15:49:30

Dla szukajÄ…cych sposobu na to z $object->method:

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

Udało mi się to w funkcji konstruowania, która wywołuje zmienną method_name ze zmiennymi parametrami.

 11
Author: danilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-08 07:27:58

Możesz to po prostu nazwać.

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

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

Wyjście:

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

 4
Author: Donnie C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 16:45:17

Dziwi mnie, że nikt tutaj nie wspomniał tylko o przejściu i wyciągnięciu tablicy. Np.:

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

Oczywiście nie zapewnia to walidacji argumentów . W tym celu każdy może użyć funkcji my expect: https://gist.github.com/iautomation/8063fc78e9508ed427d5

 2
Author: iautomation,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-01 23:33:47

Stare pytanie, wiem jednak, że żadna z odpowiedzi tutaj naprawdę zrobić dobrą robotę po prostu odpowiedzieć na pytanie.

Po prostu bawiłem się z php i rozwiązanie wygląda tak:

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

Ta funkcja może zrobić dwie rzeczy:

Jeśli jest wywołany tylko z wymaganym parametrem: myFunction("Hi") Wyświetli "Hi default"

Ale jeśli zostanie wywołana z opcjonalnym parametrem: myFunction("Hi","me") Będzie drukować "Hi me";

Mam nadzieję, że to pomoże każdemu, kto szuka tego w dół droga.

 1
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 16:25:38

Oto rozwiÄ…zanie za pomocÄ… magicznej metody _ _ invoke

(dostępne od 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){

    }
}

Z wewnÄ…trz tej samej klasy:

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

Z instancji obiektu:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
 0
Author: Dieter Gribnitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 11:09:48