Funkcje z dużą ilością argumentów w PHP

Jeżeli zdarzyło Ci się kiedyś, że stworzyłeś funkcję z małą ilością przekazywanych argumentów, ale z biegiem czasu liczba ta zaczęła wzrastać, a Ty nie wiedziałeś jak to „ładniej” ogarnąć – ten tekst jest dla Ciebie. Jeśli nie miałeś takiej przygody, ale sam zastanawiasz się jak w takim przypadku postępować to również zapraszam do czytadła :)

Załóżmy, że stworzyłeś funkcję, która z biegiem czasu ma już np. 15 argumentów – bardzo dużo prawda ?! Teoretycznie mógłbyś to olać i zostawić tak, ale załóżmy, że wolisz żeby wszystko było tak jak być powinno albo przynajmniej dążyło do pewnej poprawności.

Mamy więc funkcję typu :

function wykonajJakasAkce($argument1,$argument2,....,$argument15)
{
//ciało funkcji
}

Przyznasz, że funkcja z takim zestawem argumentów wygląda okropnie, a i samo korzystanie z niej raczej do najprzyjemniejszej części kodzenia należeć nie będzie. Przekażmy więc argumenty w postaci tablicy – najlepiej asocjacyjnej i wtedy możemy łatwo odnosić się do poszczególnych elementów.

function wykonajJakasAkce($argumenty)
{
echo $argumenty['argument15'];
}

wykonajJakasAkce(array('argument1' => 'wartość argumentu 1','argument2' => 'wartość argumentu 2','argument15' => 'wartość argumentu 15'));

Jeśli chcielibyśmy totalnie wyeliminować zapis argumentów w definicji to możemy skorzystać z func_get_args() i w ten sposób mamy zapis :

function wykonajJakasAkce($argumenty)
{
$argumenty = func_get_args();
$argumenty = $argumenty[0];
echo $argumenty['argument15'];
}

wykonajJakasAkce(array('argument1' => 'wartość argumentu 1','argument2' => 'wartość argumentu 2','argument15' => 'wartość argumentu 15'));

Patrząc na powyższy kod, aż się prosi napisać $argumenty = func_get_args()[0], ale niestety PHP na ten moment nie pozwala nam na taki zapis.

Wróćmy jeszcze do sytuacji kiedy pierw stworzyliśmy funkcję z dużą ilością zdefiniowanych argumentów, a teraz chcemy sobie ten zapis uporządkować. Skoro zaczęliśmy od „normalnego” przekazywania argumentów to w ciele funkcji korzystamy ze zmiennych typu $argument1, $argument2, $argument15 itd. Skoro przerzucamy się na tablicowy przekaz argumentów to wypadałoby te zmienne zamienić na zapis $argumenty[argument1], $argumenty[argument2], $argumenty[argument15]. Jeżeli jednak nam to przeszkadza lub z jakiegoś powodu nie chcemy tego robić to ratunkiem dla nas jest poniższy kod :

function wykonajJakasAkce($argumenty)
{
  foreach(func_get_args() as $tablica_argumentow)
  {
    foreach($tablica_argumentow as $klucz => $wartosc)
    {
      $$klucz = $wartosc;
    }
  }
  echo $argument15;
}

wykonajJakasAkce(array('argument1' => 'wartość argumentu 1','argument2' => 'wartość argumentu 2','argument15' => 'wartość argumentu 15'));

Można by również pokusić się o sprawdzenie czy argumenty faktycznie zostały przekazane żeby nie dopuścić do sytuacji kiedy foreach będzie próbować wykonać się na „niczym”. Ale to już pozostawiam do własnej implementacji :)

VN:F [1.9.22_1171]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


× jeden = 2

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>