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?
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');
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' ) );
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);
}
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) { /**/ }
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.
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)
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
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.
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'])
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