Funktionen braucht man, um Unterprogramme zu definieren, die immer wieder aufgerufen werden können. Vorteile sind eine kürzere und übersichtlichere Programmiersprache. Funktionen können einen oder mehrere Parameter haben.
function funktionsname()
{
Anweisungen;
Anweisungen;
}
Aufruf der Funktion
funktionsname()
Eine Funktion beginnt
mit dem Schlüsselwort function
gefolgt von einem selbstvergebenen Namen. Hier gelten die gleichen Regeln wie bei Variablennamen, nur dass Funktionsnamen kein Dollarzeichen am Anfang haben.
Es folgt ein Anweisungsblock in geschweiften Klammern, in welchen, eingeschlossen, verschiedenen Anweisungen aufgeführt werden können. Die Anweisungen stehen jeweils in einer Zeile und werden mit Strichpunkt getrennt.
Wenn man die Funktion aufruft, werden die Anweisungen ausgeführt. Der Aufruf der Funktion erfolgt über den Funktionsnamen und der Klammer.
In den Klammern nach dem Funktionsnamen kann man eine
beliebige Anzahl von Parametern mit Kommata getrennt einfügen
(dazu später mehr).
Die Parameter einer Funktion sind Variablen, die innerhalb der Funktion genutzt werden. Das heisst
hier werden beim Aufruf der Funktion Werte zugewiesen, die dann in der Funktion verarbeitet werden.
Ausserhalb der Funktion haben diese Variablen normalerweise
keine Gültigkeit. Die Werte, die man den Parametern zuweist nennt man Argumente. Die beiden Begriffe werden häufig verwechselt.
hallo | <?php function test($wert){ echo $wert; } test ("hallo"); ?> |
Im obigen Beispiel wird zuerst eine Funktion mit dem Namen test mit einem Parameter $wert definiert. Anschliessend
wird diese Funktion aufgerufen test("hallo");
Hier bekommt der Parameter einen Wert zugewiesen, welcher dann in der Anweisung
der Funktion verarbeitet wird echo $wert;
Den zugewiesenen Wert nennt man Argument. Das Argument ist der Wert des Parameters.
Wenn man mehrere Parameter mit Komma getrennt setzt, muss man die Argumente in gleicher Reihenfolge mit Komma getrennt einfügen.
Man kann die Parameter mit Standardwerten belegen. Will man beim Funktionsaufruf diesen Standardwert nutzen, braucht man das Argument nicht anzugeben.
Gibt man den Wert beim Aufruf der Funktion an, wird der Standardwert überschrieben.
function bruttoAnzeigen($wert, $mwst = 19) { echo $wert * (100 + $mwst) / 100; } bruttoAnzeigen(30);
35.7
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"); ?> |
Hat man mehrere Parameter mit Vorbelegung, kann es vorkommen, dass man beispielsweise den letzten Parameter mit einem eigenen Wert belegen will, aber die anderen Parameter sollen ihre Standardwerte behalten.
In dem Fall bietet es sich an, benannte Argumente einzusetzen. Die Bezeichner der Parameter werden ohne Dollarzeichen am Anfang aufgeführt gefolgt von einem Doppelpunkt und dem gewünschten Wert.
function bruttoAnzeigen($wert, $mwst = 19, $waehrung = "€") { echo $wert * (100 + $mwst) / 100 . " " . $waehrung; } bruttoAnzeigen(wert: 30, waehrung: "$");
Wenn man sich an die Reihenfolge hält ist es möglich keine Namen anzugeben. So könnte der Aufruf der Funktion auch so notiert sein.
bruttoAnzeigen(30, waehrung: "$");
Eine Funktion kann einen Rückgabewert liefern, den man in Ausdrücken
verwenden kann oder den man einer Variablen zuweisen 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 mehrere return Anweisungen in einer Funktion unterbringen, die auch
unterschiedliche Typen haben können.
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); ?> |
Das interessante an folgendem Beispiel, ist die Tatsache, dass die Variable $wert beim Aufruf mittels echo ihren ursprünglichen Wert beibehalten hat. Wenn man Javascript kennt ist das nicht weiter verwunderlich. Wenn man eine Variable irgendwo zuweist, wird nicht ein Verweis auf die Variable übergeben, sondern lediglich der Wert zugewiesen. Siehe das nächste Thema call by reference
3 5 |
<?php $wert =5; function callV($xyz){ $xyz=3; return $xyz; } echo callV($wert);//3 echo "<br>"; echo $wert;//5 ?> |
Will man eine Referenz auf die Variable setzen, so dass die außerhalb gelegene, formale Variable auf die gleiche Speicheradresse, wie die funktionsinterne Variable verweist, so muss man ein & vor den Variablennamen setzen. Die Änderung der Variable $xyz 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. Das hat eigentlich nichts mit Funktionen zu tun, sondern man kann generell eine Referenz auf eine Variable setzen.
3 3 |
<?php $wert =5; function callR(&$xyz){ $xyz=3; return $xyz; } echo callR($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. Wäre es keine static Variable wäre ihr Wert bei jedem Funktionsauf 1 und würde sich nicht erhöhen.
++$Var siehe increment
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 die nichts miteinander zu tun haben. 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. Dazu setzt man das Schüsselwort global
davor. Alternativ ist auch folgende Schreibweise möglich: $GLOBALS["bezeichner"]
Der Bezeichner muss in Anführungszeichen ohne Dollarzeichen am Anfang. Es handelt sich bei dieser Syntax um ein assoziatives Array, welches alle globlen Variablen enthält. siehe Manual $GLOBALS[].
- $wert = 30;
- global $wert
- $GLOBALS["wert"]
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.
global $x
oder man nutzt $GLOBALS["bezeichner"]
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]; |
Man kann in Funktionen auch die Datentypen der Parameter angeben und den Datentyp des Rückgabewerts. Im folgendem Beispiel sehen wir vor dem Parameter den gewünschten Datentyp. Außerdem wird nach der Klammer ein Doppelpunkt mit Datentyp aufgeführt. Er definiert den Rückgabewert.
function machWas(int $a): int { return $a*2 }
Es funktioniert jedoch auch wenn man beim Aufruf der Funktion einen String mit einer Zahl angibt, denn der String wird dann intern in einen integer umgewandelt. Damit das nicht funktioniert gibt man am Anfang des Scripts folgende Zeile ein.
declare(strict_types=1);
Man kann auch mehrere Datentypen angeben. Diese werden dann mit dem Pipe-Zeichen getrennt int|float
function machWas(int|float $a) : int|float { return $a*2; }
Ab PHP Vers.8 kann man auch mixed
angeben, das bedeutet es sind mehrere Datentypen möglich. Das Schlüsselwort void setzt man ein, für eine Funktion ohne Rückgabewert.
Folgende Datentypen sind möglich
int
float
array
string
bool
Weitere sind
mixed
/ alle Datentypen
void
/ bei einer Funktion ohne Rückgabewert
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.
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"); ?> |
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 weitere Möglichkeit eine Funktion anzulegen, ist neben dem Rückgabewert noch einen Fehlercode zu definieren. 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); ?> |
Klassen sind so etwas wie ein Blueprint, eine Vorlage, die man einsetzen kann.
Klassen gibt es in vielen Programmiersprachen. Klassen wurden erfunden, um komplexe Programmierungen verständlich anzulegen. Dazu werden Konzepte aus der wirklichen Welt in die Programmiersprache übertragen. Ein typisches Beispiel, um das Konzept zu erklären ist folgendes: Nehmen wir ein Auto, das Auto hat Eigenschaften wie Farbe, Türen, Lenkrad, Sitze. Außerdem hat es Methoden wie fahren, bremsen, lüften etc. Diese Dinge werden alle in einem Blueprint definiert. Dieser Blueprint oder diese Vorlage ist die Klasse.
Von dieser Klasse erzeugt man dann Instanzen. Die Instanzen bekommen einen eigenen Namen und man kann ihnen unterschiedliche Eigenschaftswerte zuweisen, beispielsweise eine andere Farbe eine andere Anzahl an Türen. Diese Instanzen können fahren, bremsen. Das entspricht dem Aufruf einer Methode. Eine Methode entspricht einer Funktion, die der Klasse zugewiesen ist.
Dieses Konzept könnte man auch auf andere Dinge anwenden beispielsweise auf eine Schlange, einen Kuchen, einen Warenkorb oder eine Spielfigur oder Waffe in einer Computerspielprogrammierung.
Im folgendem Beispiel wird eine Klasse Warenkorb mit dem Schlüsselwort class deklariert. Darin werden die Eigenschaften $kunde und $waren und die Methoden addProduct() und showProducts() erzeugt.
Man beachte, dass die interne Eigenschaft $waren innerhalb der Methoden mit der Syntax
$this->waren angesprochen wird.
Nach der Klassendeklaration wird eine neue Instanz oder Objekt der Klasse Warenkorb erezeugt und zwar mit dem Schlüsselwort new. Es hat hier den Namen $produkte
bekommen $produkte = new Warenkorb;
Dann werden Eigenschaftswerte zugewiesen und Methoden aufgerufen.
Das geschieht über eine Pfeilsyntax:
$produkte->kunde = "Walter";
$produkte->addProduct("Hose");
Hier folgt der komplette Code.
class Warenkorb { public $kunde; public $waren = []; public function addProduct($zutat) { array_unshift($this->waren, $zutat); } public function showProducts() { foreach ($this->waren as $n) { echo "$n <br>"; } } } $produkte = new Warenkorb; $produkte->kunde = "Walter"; $produkte->addProduct("Hose"); $produkte->addProduct("Jacke"); $produkte->showProducts();
Wie in anderen Programmiersprachen, kann man auch in PHP Konstruktorfunktionen in Klassen einsetzen.
Siehe PHP Manual Konstruktoren
Eine Konstruktorfunktion wird aufgerufen, wenn ein neues Objekt der Klasse erzeugt wird. Damit hat man die Möglichkeit dem Objekt beim Intialisieren bestimmte Eigenschaftswerte zuzuweisen. Obiges Beispiel wird hier um eine Konstruktorfunktion erweitert. Beim Initialisieren wird der Name für die Eigenschaft $kunde zugewiesen.
class Warenkorb { public $kunde; public $waren = []; function __construct($kunde) { $this->kunde = $kunde; } } $produkte = new Warenkorb("Willi"); echo $produkte->kunde;
Wenn ein Member als "protected" deklariert ist, bedeutet dies, dass er innerhalb der Klasse und auch in abgeleiteten Klassen (Kindklassen) zugänglich ist. Andere Klassen, die nicht von dieser Klasse erben, haben keinen direkten Zugriff auf geschützte Mitglieder.
Wenn ein Member als "private" deklariert ist, bedeutet dies, dass er nur innerhalb der Klasse, in der er definiert ist, zugegriffen werden kann. Andere Klassen, die von dieser Klasse erben, haben keinen direkten Zugriff auf private Mitglieder.
Webdesign / PHP / mySQL / Dreamweaver MX Tipps
Copyright © Michael Albers
www.pastorpixel.de