Mam funkcję PHP, która przyjmuje zmienną liczbę argumentów (używając func_num_args()
i func_get_args()
), ale liczba argumentów, które chcę przekazać, zależy od długości tablicy. Czy istnieje sposób na wywołanie funkcji PHP ze zmienną liczbą argumentów?
php
variadic-functions
nohat
źródło
źródło
Odpowiedzi:
Jeśli masz swoje argumenty w tablicy, możesz być zainteresowany
call_user_func_array
funkcją.Jeśli liczba argumentów, które chcesz przekazać, zależy od długości tablicy, prawdopodobnie oznacza to, że możesz samodzielnie spakować je do tablicy - i użyć tego jako drugiego parametru programu
call_user_func_array
.Elementy tej przekazanej tablicy zostaną następnie odebrane przez funkcję jako odrębne parametry.
Na przykład, jeśli masz tę funkcję:
Możesz spakować swoje parametry w tablicę, na przykład:
A następnie wywołaj funkcję:
Ten kod wyświetli:
tj. 3 parametry; dokładnie tak, jak funkcja iof została wywołana w ten sposób:
źródło
Jest to teraz możliwe w PHP 5.6.x , używając operatora ... (znanego również jako operator splat w niektórych językach):
Przykład:
źródło
W nowym Php 5.6 możesz użyć
... operator
zamiastfunc_get_args()
.Dzięki temu możesz uzyskać wszystkie przekazane parametry:
źródło
Od PHP 5.6 listę argumentów zmiennych można określić za pomocą
...
operatora.Jak widać,
...
operator zbiera zmienną listę argumentów w tablicy.Jeśli chcesz przekazać zmienne argumenty do innej funkcji,
...
nadal może ci pomóc.Od PHP 7 lista zmiennych argumentów może być wymuszona, aby wszystkie były tego samego typu.
źródło
Dla tych, którzy szukają sposobu na zrobienie tego za pomocą
$object->method
:Udało mi się to w funkcji konstrukcji, która wywołuje zmienną nazwa_metody ze zmiennymi parametrami.
źródło
$object->method_name(...$array);
$object->method_name(&...$args);
Możesz to po prostu nazwać.
Wynik:
Tablica ([0] => bla) Tablica ([0] => bla [1] => bla)
źródło
Dziwię się, że nikt tutaj nie wspomniał po prostu o przekazywaniu i wyodrębnianiu tablicy. Na przykład:
Oczywiście nie zapewnia to walidacji argumentów . W tym celu każdy może skorzystać z funkcji my Expect: https://gist.github.com/iautomation/8063fc78e9508ed427d5
źródło
Stare pytanie, ale wiem, że żadna z odpowiedzi nie jest tak naprawdę dobra, polegająca na prostej odpowiedzi na pytanie.
Po prostu bawiłem się php i rozwiązanie wygląda następująco:
Ta funkcja może zrobić dwie rzeczy:
Jeśli zostanie wywołany tylko z wymaganym parametrem:
myFunction("Hi")
wyświetli "Hi default"Ale jeśli zostanie wywołany z opcjonalnym parametrem:
myFunction("Hi","me")
wyświetli "Cześć mi";Mam nadzieję, że pomoże to każdemu, kto szuka tego w przyszłości.
źródło
Oto rozwiązanie wykorzystujące magiczną metodę __invoke
(Dostępne od php 5.3)
Z wewnątrz tej samej klasy:
Z instancji obiektu:
źródło
call_user_func_array
jak stwierdzono w odpowiedziach najczęściej głosowanych w 2009 roku. Może jest sens, aby zawijać coś więcej__invoke
- ale nie widzę tego.