Funktionen braucht man, um Unterprogramme zu definieren, die immer wieder aufgerufen
werden können. Der Vorteil ist eine kürzere und übersichtilichere
Programmiersprache.
function functionsname(Argumente)
{
Anweisungen;
Anweisungen;
}
Eine Funktion beginnt
mit dem Schlüsselwort function
gefolt von einem selbstvergebenen Namen. In den folgenden Klammern kann man eine
beliebige Anzahl von Argumenten oder Paramentern mit Kommata getrennt einfügen
(dazu später mehr). Es folgen geschweifte Klammern, in welchen, eingeschlossen,
verschiedenen Anweisungen aufgeführt werden können. Die Anweisungen
stehen jeweils in einer Zeile und werden mit Strichpunkt getrennt.
Die Argumente oder Parameter einer Funktion sind aktuelle Variablen. Das heisst
hier werden beim Aufruf der Funktion Werte zugewiesen, die dann verarbeitet werden.
Ausserhalb der Funktion haben diese Variablen normalerweise
keine Gültigkeit
| hallo | <?php function test($wert){ echo $wert; } test ("hallo"); ?> |
Im obigen Beispiel wird zuerst eine Funktion mit Parameter definiert. Anschliessend wird diese Funktion aufgerufen funktionsname(Argument); Hier bekommt das Argument einen Wert zugewiesen, welcher dann in der Anweisung der Funktion verarbeitet wird echo $wert;
Mittels function_exists() kann man vor Aufruf einer Funktion überprüfen, ob die Funktion überhaupt vorhanden ist. Es wird der Wert true zurückgegeben.
| Yippi | <?php if (function_exists("test")){ test("Yippi"); } ?> |
Eine richtige Funnktion braucht noch einen Rückgabewert, den man in Ausdrücken verwenden kann. Dazu verwendet man das Schlüsselwort return .Funktionen, die keinen Rückgabewert liefern nennt man Prozeduren.
| Hallo | <?php function test1 (){ return "Hallo"; } echo test1(); ?> |
| selber Hallo | <?php function test2 ($wert){ return $wert; } echo test2("selber Hallo"); ?> |
| HALLO | <?php echo strtoupper(test1()); ?> |
Eine Funktion kann wie ein Operand z.B. eine Variable in Ausdrücken verwendet
werden. Der Datentyp wird vom Rückgabewert bestimmt.z.B.
return 123, wäre der Typ Integer.
Man kann zwar mehrere return Anweisungen in einer Funktion unterbringen, die auch
unterschiedliche Typen haben können, aber davon sollte man Abstand nehmen.
Sobald eine return Anweisung erreicht wird, wird die Funktion beendet. Im folgenden
Beispiel wird je nach Parameterwert eine der beiden return Anweisungen ausgeführt.(
if else)
| 20 | <?php function zahltest($wert){ if($wert<20){ return $wert; } else{ return 20; } } echo zahltest(50); ?> |
Eine weitere Möglichkeit eine Funktion anzulegen, ist neben dem Rückgabewert noch einen Fehlercode zu definieren. Das In einer if-Struktur wird bei falschen Parametereingaben ein anderer Rückgabewert zugewiesen. In einer zweiten if-Struktur beim Aufruf der Funktion, wird der Rückgabewert überrprüft und beim Fehler-Rückgabewert ein entsprechender Hinweistext ausgegeben. Im zweiten Beispiel wurde auf diese Überprüfung verzichtet.
| 214 | <?php |
| Der Gesamtpreis inkl. 16% MwSt ist: 626.4 EUR | <?php $netto=54; $anzahl = 10; echo " Der Gesamtpreis inkl. 16% MwSt ist: "; echo brutto(54,16)*$anzahl; echo " EUR"; ?> |
| Mehrwertsteuer: 240 | <?php function MwSt($netto,$MwSt){ $netto=doubleval($netto); $MwSt=doubleval($MwSt); if($netto>0 and $MwSt>0){ return $netto*$MwSt/100; } else{ return false; } } /* Hier beginnt der Aufruf der Funktion */ echo "Mehrwertsteuer: ",MwSt(1500,16); ?> |
Das interessante an folgendem Beispiel, ist die Tatsache, dass die Variable $wert
beim zweiten Aufruf mittels echo ihren ursprünglichen Wert beibehalten hat.
In vielen anderen Programmiersprachen, hätte $wert den Wert der Variablen
$argument übernommen. In PHP jedoch nicht, da aktuelle und formale Variablen
unabhängig sind, selbst wenn sie gleiche Namen haben, also selbst wenn in
diesem Beispiel die Variable $argument auch $wert heissen würde.
Man nennt das auch Call by value, das heisst die Funktion soll nur über
ihren Rückgabewert auf den Programm Code wirken. Alle funktionsinternen Anweisungen
wirken nur innerhalb der Funktion. So treten keine Seiteneffekte auf, das heisst,
Variablen ausserhalb der Funktion, gleichen Namens werden nicht unbeabsichtigt
verändert.
|
3 5 |
<?php $wert =5; function test6($argmuent){ $argument=3; return $argument; } echo test6($wert); echo "<br>"; echo $wert; ?> |
Will man jedoch, dass die Aufrufvariable in der Funktion verändert wird, so dass die ausserhalb gelegene, formale Variable auf die gleiche Speicheradresse, wie die funktionsinterne Variable verweist, so muss man ein & vor das Argument der Funktion setzen. Die Änderung der Variable $parameter wirkt sich nun auf die Variable $wert ausserhalb der Funktion aus. Das nennt man auch call by reference, jedoch ist diese Vorgehensweise eher die Ausnahme.
|
3 3 |
<?php $wert =5; function test7(&$parameter){ $parameter=3; return $parameter; } echo test7($wert); echo "<br>"; echo $wert; ?> |
Argumente, Parameter oder Variablen innerhalb der Funktion haben ausserhalb keine Gültigkeit und werden nach Abarbeitung der Funktion gelöscht. Jedoch können in Funktionen auch globale Variablen benutzt werden. Ausserdem kann man verhindern, dass eine Variable nach Beendigung der Funktion gelöscht wird.
Eine static Variable wird, nachdem die Funktion abgearbeitet ist, nicht gelöscht.
Im Gegensatz zur globalen Variablen kann man sie ausserhalb zwar nicht aufrufen,
jedoch bleibt ihr Wert für einen erneuten Funktionsaufruf erhalten.
(++$Var siehe Variable)
|
1 2 3 |
<?php function zaehler() { static $Var; return ++$Var; } echo zaehler(); echo "<br>"; echo zaehler(); echo "<br>"; echo zaehler(); ?> |
Hat man eine Variable innerhalb der Funktion, die den gleichen Namen hat, wie eine Variable ausserhalb der Funktion, so hat man 2 Variablen. Das wurde schon in den Erklärungen oben unter Call by value deutlich. Es gibt jedoch die Möglichkeit die Variable innerhalb der Funktion als global zu deklarieren, so dass man sie im gesamten Script aufrufen kann.
|
6 4 |
<?php $werta=4; function testa() { $werta=6; return $werta; } echo testa(); echo "<br>"; echo $werta; ?> |
|
6 6 |
<?php $wertb=4; function testb() { global $wertb; $wertb=6; return $wertb; } echo testb(); echo "<br>"; echo $wertb; ?> |
Vergleiche die beiden Funktionen. In der ersten haben wir 2 Variablen gleichen Namens, innerhalb und ausserhalb der Funktion: $werta. Im letzten Beispiel wird die Variable innerhalb der Funktion in eine globale Variable umgewandelt, so dass wir nur eine Varible namens $wertb haben, die innerhalb der Funktion geändert werden kann.
Die folgende Funktion dient dazu aus 2 Datumswerten, die beispielsweise aus Formulareingaben stammen könnten, die Datumsdifferenz in Tagen auszurechnen. Es sind 2 Schreibweisen möglich
"01.02.05"
oder "01.02.2005"
Statt der Punkte könnten auch andere Trennzeichen wie beispielsweise Kommata verwendet werden.
| function DatumsDiff($Start,$Ende) { $Tag1=(int) substr($Start, 0,2); $Monat1=(int) substr($Start, 3, 2); $Jahr1=(int) substr($Start, 6, 4); $Tag2=(int) substr($Ende, 0, 2); $Monat2=(int) substr($Ende, 3, 2); $Jahr2=(int) substr($Ende, 6, 4); if (checkdate($Monat1, $Tag1, $Jahr1)and checkdate($Monat2, $Tag2, $Jahr2)) $Diff=(Integer) (($Datum1-$Datum2)/3600/24); |
|
| 204 | <?php echo DatumsDiff("02.05.05", "10.10.04"); ?> |
Zu Beginn der Funktion werden die beiden Argumente $Start und $Ende mittels substr() in ihre Bestandteile zerlegt. Der Wert wird als Ganzzahl (int) ausgegeben.
In der folgenden if Struktur wird daraus wieder ein Datum erzeugt und mittels checkdate() überprüft, ob es sich um sinnvolle Datumseingaben handelt. Ist das nicht der Fall tritt else in Kraft und der Wert -1 wird ausgegeben.
Mit mktime wird von jedem Datum jeweils ein Zeitstempel erzeugt und in den Variablen $Datum1 und $Datum2 abgelegt. Dann wird $Datum2 von $Datum1 subtrahiert. Da wir durch diese Subtraktion einen Wert in Sekunden erhalten, wird dieser Wert noch durch 3600 geteilt, um Stunden zu erhalten und anschließend durch 24 geteilt, um Tage zu erhalten.
Im zweiten Abschnitt wird die Funktion aufgerufen und mit echo ausgegeben. Hier wäre auch eine Formulareingabe denkbar.
hier wird ein neues Datum nach Ablauf einer bestimmten Frist ausgegeben (Fälligkeitsdatum). Das lässt sich beispielsweise einsetzen um das Datum einer Zahlungsforderung zu bestimmen, oder um ein Datum auszugeben, an dem eine Ware spätestens eintreffen wird etc. Da diese Frist oft vom aktuellen Datum aus errechnet werden soll, ist es in dieser Funktion möglich, das erste Argument $Heute freizulassen. Im zweiten Argument $Frist muss die Anzahl der Tage eingegeben werden.
| <?php function Faelligkeit($Heute,$Frist) { if(checkdate($Monat, $Tag, $Jahr)){ ?> |
|
| 05.06.12 | <?php echo Faelligkeit ("",14); ?> |
| 06.03.05 | <?php echo Faelligkeit ("20.02.05",14); ?> |
In der ersten if Struktur der Funktion wird geprüft, ob das erste Argument $Heute einen Leerstring enthält (eventuelle Leerzeichen werden vorher mittels trim() entfernt). Enhält $Heute einen Leerstring, bekommt $Heute das aktuelle Systemdatum zugewiesen, mittels date("d.m.y"), in der deutschen Reihenfolge Tag, Monat, Jahr.
Unabhängig davon, ob $Heute durch eine Eingabe oder durch das aktuelle Datum bestimmt wurde, wird $Heute mittels substr() in seine Bestandteile zerlegt
und den Variablen $Tag, $Monat, $ Jahr übergeben.
In der folgenden if Struktur wird daraus wieder ein Datum erzeugt und mittels checkdate() überprüft, ob es sich um eine sinnvolle Datumseingabe handelt. Ist das nicht der Fall tritt else in Kraft und der Wert -1 wird ausgegeben.
Mit mktime wird ein Zeitstempel von $Heute der Variablen $Datum übergeben. Anschließend wird in $Datum_neu die $Frist hinzugezählt und das neue Datum mittels return ausgegeben.
Siehe dazu unter Datum: In der date() Funktion kann man als zweites Argument ein eigenes Datum mit mktime() eingeben. In diesem Fall: $Datum+($Frist*3600*24)
Da das Argument $Frist in Tagen vorgegeben wird, müssen daraus noch Sekunden erzeugt werden: Tage*3600*24.
Es folgen 2 mögliche Funktionsaufrufe. Im ersten Beispiel enthält das erste Argument $Heute einen Leerstring und es tritt dadurch das aktuelle Systemdatum in Kraft. Im zweiten Beispiel, wird $Heute ein bestimmtes Datum vorgegeben, hierbei müssen Tage und Monate zweistellig eingegeben werden.
Es folgt eine Funktion, die das Datum mit einem deutschen Wochentag ausgibt, als Argument $Datum wird ein gültiger Datumssting erwartet,
die Trennzeichen sind frei wählbar
"01.10.05"
"30/10/2005"
oder die date Funktion mit der deutschenFormatangabe Tag.Monat.Jahr
date("d.m.y")
<?php function Wochentag($Datum) { $Tag = date("w", $Datum); ?> |
|
| Montag, 17.10.05 | <?php echo Wochentag ("17.10.05"); ?> |
| Montag, 17.10.05 | <?php echo Wochentag ("17.10.2005"); ?> |
| Dienstag, 22.05.12 | <?php echo Wochentag (date("d.m.y")); ?> |
Zu Anfang der Funktion Wochentag wird ein Array gebildet, dessen Elemente die deutschen Wochentage bilden. In der folgenden If Struktur wird überprüft, ob das Argument $Datum überhaupt ein string ist. Ist das nicht der Fall, wird gleich eine Fehlermeldung ausgegeben.
Der folgende Teil wurde schon in den beiden vorigen Funktionen erklärt. (siehe oben)
$Tag = date("w", $Datum);
Hier wird mittels der date Funktion ein numerischer Wert für den Wochentag ermittelt, beginnend bei 0 für Sonntag.
$Tage[$Tag]
Dieser Wert wird dann als Index des zu Anfang gebildeten arrays $Tage übergeben.
In $Datum_komplett wird noch das eingebene Datum durch Kommata getrennt an den Wochentag angehängt
$Datum_komplett=$Tage[$Tag].", ". date("d.m.y", $Datum);
siehe date Funktion
Zum Ende wird $Datum_komplett mit return zurückgegeben.
In PHP wird das Konzept der variablen Funktionen unterstützt. Wenn man eine Variable mit Funktionsklammern aufruft, versucht PHP ein Funktion zu starten,wobei der Wert der Variablen als Funktionsname interpretiert wird. Wie man am dritten Beispiel sieht, kann man sogar Argumente übergeben. Der Vorteil dieser Konstruktion liegt darin, dass man Funktionsnamen in Variablen speichern kann.
<?php |
|
| Halli Hallo | <?php function saghallo(){ echo "Halli Hallo"; } $Var ="saghallo"; $Var(); ?> |
| Hollderahihi | <?php function sag($Was){ echo $Was; } $Var ="sag"; $Var("Hollderahihi"); ?> |
Manchmal ist es sinnvoll, dass die Anzahl der Argumente einer Funktion variabel ist. Dazu gibt es 2 Möglichkeiten erstens: Arrays und zweitens: die explizite Zulassung von unterschiedlich vielen Argumenten.
Im folgenden Beispiel sieht man, dass beim Aufruf der Funktion das Array $Daten wie eine Variable (ohne eckige Klammern) übergeben wird. Die erste Funktion hat noch einen Schönheitsfehler, da nur 3 Elemente des Arrays angezeigt werden. Im zweiten Beispiel wird das Problem durch die foreach Schleife gelöst. In der Funktion kann man alle Techniken der Arrayverabeitung nutzen. Auch assoziative Arrays sind als Argumente möglich.
|
Walter Anton Hubert |
<?php function arrayargument ($Werte){ echo $Werte[0], "<br>"; echo $Werte[1], "<br>"; echo $Werte[2]; } |
|
Birgit Sandra Claudia Manuela Christel |
<?php function arrayargumente ($Werte){ foreach ($Werte as $Element){ echo $Element, "<br>"; } } $Daten = array("Birgit", "Sandra", "Claudia", "Manuela", "Christel"); arrayargumente($Daten); ?> |
Ab PHP4 kann man auch eine variable Anzahl von Argumenten übergeben. Dazu wird die Funktion ohne Argument definiert. Wie man im ersten Beispiel sieht, wird die Funktion ausgeführt, aber die vergebenen Argumente werden beim Funktionsaufruf einfach ignoriert.
| schon wieder Hallo | <?php |
Damit diese Argumente übergeben werden, muss man spezielle Funktionen innerhalb der Funktion benutzen.
| Funktion | Bedeutung |
| func_num_args() | ermittelt die Anzahl der übergebenen Argumente |
| func_get_arg() | Wert eines bestimmten Arguments wird gliefert, Indexwert wird als Parameter benötigt |
| func_get_args() | Lieferung eins Arrays mit den übergebenen Argumenten |
Im folgenden Beispiel werden die Argumente mittels func_get_args ausgewertet und mittels foreach Schleife ausgegeben.
|
123 Guten Tag |
<?php |
|
Tritra Trulala der Kasperle sagt Guten Tag |
<?php function testtest (){ $Anzahl = func_num_args(); for ($n=0; $n<$Anzahl; $n++){ echo func_get_arg($n), "<br>";; } } |
Im vorigen Beispiel wird der Variablen $Anzahl die Anzahl der Argumente übergeben, welche dann in der for-Schleife die Anzahl der Schleifendurchläufe bestimmt. Die Funktion func_get_arg() benötigt als Parameter den jeweiligen Indexwert des gewünschten Arguments, beginnend bei 0 für das erste Argument.
Hier werden die Argumente einer Funktion mit Werten vorbelegt. Beachte die folgenden Funktionsaufrufe. Werden beim Funktionsaufruf Argumente übergeben, werden die Werte überschrieben.
<?php |
|
|
123 570 468 |
<?php testo(); ?> |
|
780 570 468 |
<?php testo(780); ?> |
|
Guten Tag 666 du Nase |
<?php testo("Guten Tag", 666, "du Nase"); ?> |
Eine Funktion kann mittels return nur einen Wert zurückgeben. Da es sich hierbei aber auch um ein Array handeln kann, umgeht man diese Beschränkung der Rückgabewerte.
|
123 456 789 |
<?php |
Beim Funktionsaufruf wird die Funktion einer Variablen als Wert zugewiesen.
$Werte = testreturn();
Dadurch wird die Variable zu einem Array, deren Werte hier in einer foreach Schleife ausgegeben werden.
Im folgenden wird auf eine foreach Schleife verzichtet.
| 123456 | <?php $Werte = testreturn2(); echo $Werte[0]; |