de.comp.lang.php.* FAQ

6.4. Wie schreibe ich eine Funktion mit einer variablen Anzahl von Argumenten?

Keywords: Argument | Funktion | Array

Antwort von Kristian Köhntopp

In PHP kann man Funktionsparameter mit Default-Werten versehen. Läßt man die Argumente der Funktion von hinten nach vorne weg, werden stattdessen die Defaults eingesetzt. Defaultwerte müssen skalare Konstanten sein. Variable Ausdrücke (Variablen, Funktionsaufrufe) oder nichtskalare Werte (Arrays, Objekte) sind nicht gestattet.

function beispiel($p = "default") {
  printf("Der Parameter p hat den Wert %s\n", $p);
}

beispiel("hallo");
beispiel();

Auf diese Weise kann man jedoch keine echten variadischen Funktionen schreiben. So ist es zum Beispiel nicht möglich eine Funktion wie printf() in PHP3 zu schreiben. Man kann variadische Funktionen jedoch durch die Übergabe eines Array- oder Hashparameters simulieren.

function beispiel2($p) {
  if (!isset($p) or !is_array($p))
    # Defaults setzen
    $p = array("para1" => "bla", "para2" => "fasel");

  if ($p["para1"])
    machdies();

  if ($p["para2"])
    machdas();
}

beispiel2(array("para1" => "laber", "para2" => "lall"));

Seit PHP4 sind auch echte variadische Funktionen möglich. Dort gibt es die drei Funktionen

func_num_args()

Diese Funktion liefert die Anzahl der Funktionsargumente als Integer.

func_get_arg()

Diese Funktion bekommt eine Argumentnummer als Parameter und liefert des Wert des Funktionsargumentes mit diesem Index zurück.

func_get_args()

Diese Funktion liefert alle Argumente einer Funktion als Array zurück.

Eine echte variadische Funktion kann also in PHP4 folgendermaßen geschrieben werden:

function beispiel3() {
    $args = func_get_args();
    for($i=0; $i<count($args); $i++) {
         print($args[$i]."\n");
    }
}

beispiel3("das", "ist", "ein", "test");

Valid HTML 4.01! Valid CSS!

6.4. Wie schreibe ich eine Funktion mit einer variablen Anzahl von Argumenten?
http://www.php-faq.de/q/q-funktion-variabel.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team