Wydaje mi się, że pamiętam, że w PHP istnieje sposób na przekazanie tablicy jako listy argumentów funkcji, dereferencjonując tablicę w standardowy func($arg1, $arg2)
sposób. Ale teraz nie wiem, jak to zrobić. Przypominam sobie sposób przekazywania przez odniesienie, „globowanie” przychodzących parametrów ... ale nie sposób usuwania tablicy do listy argumentów.
Może to być tak proste, jak func(&$myArgs)
, ale jestem pewien, że to nie jest to. Niestety, jak dotąd podręcznik php.net niczego nie ujawnił. Nie, żebym musiał używać tej konkretnej funkcji przez ostatni rok.
$args = [1,2,3]; function(...$args){}
callable
, który używa tego samegocall_user_func_array
, tylko z tablicą, w której pierwszy element to obiekt, a drugi to metoda. Na przykładcall_user_func_array([$object, 'method'], $myArgs);
Jak już wspomniano , od PHP 5.6+ możesz (powinieneś!) Użyć
...
tokena (znanego również jako "operator splat", część funkcjonalności funkcji wariadycznych ), aby łatwo wywołać funkcję z tablicą argumentów:Uwaga: elementy tablicy są mapowane na argumenty na podstawie ich pozycji w tablicy, a nie kluczy.
Zgodnie z komentarzem CarlosCarucce , ta forma rozpakowywania argumentów jest zdecydowanie najszybszą metodą we wszystkich przypadkach. W niektórych porównaniach jest ponad 5 razy szybszy niż
call_user_func_array
.Na bok
Ponieważ myślę, że jest to naprawdę przydatne (choć nie jest bezpośrednio związane z pytaniem): możesz wskazać parametr operatora splat w definicji funkcji, aby upewnić się, że wszystkie przekazane wartości pasują do określonego typu.
(Pamiętaj tylko, że robiąc to MUSI to być ostatni zdefiniowany parametr i że wszystkie parametry przekazane do funkcji zostaną umieszczone w tablicy).
Jest to świetne do upewnienia się, że tablica zawiera elementy określonego typu:
źródło
call_user_func_array
. Więc jeśli używasz php 5.6+, polecam ten. Oto test , który był cytowany na oficjalnej wiki phpPamiętaj również, że jeśli chcesz zastosować metodę instancji do tablicy, musisz przekazać funkcję jako:
źródło
$foo->bar()
Przykład na połączonej stronie sugeruje, że tak powinno byćarray($instance, "MethodName")
.call_user_func_array(array(parent, "__construct"), func_get_args());
Ze względu na kompletność, od PHP 5.1 to również działa:
Widzieć: http://php.net/reflectionfunction.invokeargs
W przypadku metod zamiast tego używasz ReflectionMethod :: invokeArgs i przekazujesz obiekt jako pierwszy parametr.
źródło