Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF] pobieranie argumentów przez func_num_args
Forum PHP.pl > Forum > PHP > Frameworki
tvister
W SFv1 nie wiem jak w v2 często pobierane są argumenty wywołania funkcji/metody przez func_num_args() niż przez jawne wskazanie w definicji.
Jest ku temu jakiś powód? Czy to tylko taki optymalny zapis Fabien-a:-)
Kamil Adryjanek
Chodzi o to, że PHP nie obsługuje przeciążania funkcji (overloading), przez co nie można utworzyć kilku funkcji o tej samej nazwie różniących się argumentami.
tvister
Cytat
Chodzi o to, że PHP nie obsługuje przeciążania funkcji (overloading), przez co nie można utworzyć kilku funkcji o tej samej nazwie różniących się argumentami.


hehe, manual jest znany smile.gif

Być może nie doprecyzowałem pytania.
Jeżeli mamy opcje parametryzowania wprost poprzez jawne wskazanie parametrów czyli np. funcja test($p1=null, $p2=null) i więcej parametrów nie będzie
to w kodzie SF są miejsca gdzie zastępowane to jest function test() { func_num_args itd.. . Pierwsza opcja jest czytelniejsza natomiast druga może wydajniejsza?? a czytelność
nadrabia się phpdoc-em.
Kamil Adryjanek
Jeśli z góry wiadomo jakie parametry przyjmuje funkcja to wykorzystanie func_get_args nie ma sensu. Jeśli chodzi o wydajność to podejrzewam, że wykorzystanie func_get_args jest wolniejsze niż jawne określenie parametrów.
Dla przykładu funkcja z helpera: url_for - może przyjąć 2 lub 3 parametry. W tej sytuacji na podstawie pierwszego parametru wywoływana jest kolejny funkcja z wszystkimi parametrami jakie zostały przekazane do url_for - i tak naprawdę w tym momencie nie jest istotne ile parametrów zostało przekazanych do url_for. Tak jak napisałem wcześniej jest to obejście dla dwóch funkcji o tych samych nazwach i różnych argumentach:

  1. function url_for($internal_uri, $absolute = false)
  2. function url_for($routeName, $params = array(), $absolute = false):


  1. function url_for()
  2. {
  3. // for BC with 1.1
  4. $arguments = func_get_args();
  5. if (is_array($arguments[0]) || '@' == substr($arguments[0], 0, 1) || false !== strpos($arguments[0], '/'))
  6. {
  7. return call_user_func_array('url_for1', $arguments);
  8. }
  9. else
  10. {
  11. return call_user_func_array('url_for2', $arguments);
  12. }
  13. }
tvister
Rzeczywiście ciekawa logika. Trochę cięzko wyobrazić zastosowanie dla podanego przykładu. Ale domyślam się że to ma znaczenie
przy operacjach seryjnych kiedy argumenty mogą być zróżnicowane.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.