Grundlegende Konzepte und Strukturen von PHP Function
Sie befinden sich:
Home >
Php >
Grundlegende Konzepte und Strukturen von PHP Function
In der Welt der Programmierung spielt PHP eine bedeutende Rolle, besonders wenn es um die
Erstellung dynamischer Webseiten geht. Eine der grundlegenden Komponenten von PHP sind die
Funktionen. Eine Funktion in PHP ist ein Block von Anweisungen,
der eine bestimmte Aufgabe ausführt. Sie können sich eine Funktion als eine kleine
Fabrik vorstellen, die spezifische Eingaben (Inputs) nimmt, etwas damit macht und dann ein
Ergebnis (Output) liefert.
PHP Functions
In PHP gibt es zwei Hauptarten von Funktionen: die eingebauten und die benutzerdefinierten
Funktionen. Die eingebauten Funktionen sind bereits in PHP integriert
und können sichekt verwendet werden. Es gibt so etwa Funktionen, um Texte zu bearbeiten,
Daten zu sortieren oder mathematische Berechnungen durchzuführen. Jedoch erlauben es
uns benutzerdefinierte Funktionen, unsere eigenen Funktionen zu schreiben,
um spezielle Aufgaben zu erfüllen, die nicht sichekt durch eingebaute Funktionen
abgedeckt werden.
Definition und Aufruf einer PHP-Funktion
Die Definition einer PHP-Funktion beginnt mit dem Schlüsselwort function,
gefolgt von einem eindeutigen Funktionsnamen und einer optionalen Liste von
Funktionsparametern, die in runden Klammern eingeschlossen sind. Der Code, der die
eigentliche Arbeit der Funktion leistet, wird in geschweiften Klammern {} geschrieben.
Hier ist ein einfaches Beispiel für die Definition einer Funktion:
<?php
function sagHallo() {
echo "Hallo, Welt!";
}
In diesem Beispiel ist sagHallo der Name der Funktion. Diese Funktion
nimmt keine Variable auf und wenn sie aufgerufen wird, schreibt sie
einfach „Hallo, Welt!“ auf die Webseite.
Um eine Funktion, wie sagHallo aufzurufen, verwenden Sie einfach den Namen der
Funktion gefolgt von runden Klammern:
<?php
sagHallo();
/* Gibt aus: Hallo, Welt! */
?>
Funktionen mit Parametern
Funktionen werden oft nützlicher, wenn sie mit Hilfsvariablen arbeiten können.
Diese sind wie Variablen, die nur innerhalb der Funktion existieren und deren Werte beim
Aufruf der Funktion angegeben werden.
Betrachten wir ein Beispiel, das zeigt, wie Sie eine Funktion mit Variablen definieren und
aufrufen:
<?php
function gruessen($name) {
echo "Hallo, " . $name . "!";
}
Hier nimmt die Funktion gruessen die Variable $name auf.
Wenn die Funktion aufgerufen wird, müssen Sie einen Wert für
diesen Parameter angeben:
<?php
gruessen("Maria");
/* Gibt aus: Hallo, Maria! */
Mehrfache Funktionsaufrufe
Eine der Stärken von Funktionen liegt in ihrer Wiederverwendbarkeit. Sie können
dieselbe Funktion mehrfach mit unterschiedlichen Variablen aufrufen, um
verschiedene Ergebnisse zu erzielen. Dies macht Ihren Code effizienter und einfacher zu
verwalten.
Verwaltung von
Parametern und Rückgabewerten in PHP Function
In PHP, einer populären Sprache für Webentwicklung, ist das effektive Management
von Parametern und Rückgabewerten in Funktionen entscheidend für die Erstellung
flexibler und effizienter Anwendungen. Dieser Artikel erkundet, wie Funktionsparameter und Rückgabewerte
in PHP-Funktionen verwendet werden, um die Funktionalität von Webanwendungen zu steuern
und zu verbessern.
Parameter in PHP-Funktionen
Ein Parameter ist eine Variable in der Signatur einer Funktion,
die als Platzhalter für einen Wert dient, der beim Aufruf der Funktion übergeben
wird. Diese können optional sein oder Vorgabewerte
(default values) haben, was die Flexibilität einer Funktion erhöht,
indem sie auch ohne explizite Angabe aller Argumente aufgerufen werden kann.
Hier ein Beispiel, wie diese in einer Funktion definiert werden:
<?php
function addiere($zahl1, $zahl2 = 10) {
return $zahl1 + $zahl2;
}
In diesem Beispiel hat die Funktion addiere zwei Variable: $zahl1 und $zahl2.
Die Variable $zahl2 ist
optional und hat einen Vorgabewert von 10. Das bedeutet, dass die Funktion
auch mit nur einem Argument aufgerufen werden kann:
<?php
echo addiere(5);
/* Gibt 15 aus, weil 5 + 10 = 15 */
echo addiere(5, 3);
/* Gibt 8 aus, weil 5 + 3 = 8 */
Rückgabewerte von Funktionen
Der Rückgabewert einer Funktion ist der Wert, den die
Funktion an den Aufrufer zurücksendet. In PHP wird dies mit dem Schlüsselwort return realisiert.
Jede Funktion kann genau einen Wert zurückgeben, oder gar keinen, wenn sie lediglich
eine Aufgabe ausführt, ohne ein Ergebnis zu liefern.
Betrachten wir ein Beispiel, das die Nutzung des Rückgabewerts zeigt:
<?php
function quadrat($zahl) {
return $zahl * $zahl;
}
$resultat = quadrat(4);
echo $resultat;
/* Gibt 16 aus */
Referenzen als Parameter
PHP ermöglicht es auch, Parameter als Referenz zu übergeben (pass
by reference). Dies bedeutet, dass die Funktion sichekt auf die Speicheradresse
der übergebenen Variablen zugreift und Änderungen an dieser Variable auch außerhalb
der Funktion sichtbar sind.
Hier ist ein einfaches Beispiel:
<?php
function addEins(&$wert) {
$wert += 1;
}
$meineZahl = 10;
addEins($meineZahl);
/* Nur Funktionsaufruf ohne Return */
echo $meineZahl;
/* Gibt 11 aus, weil die Funktion den Wert von $meineZahl direkt verändert hat */
Funktionen mit variabler Anzahl von
Parametern
Manchmal ist es notwendig, dass eine Funktion eine variable Anzahl von
Funktionsparametern akzeptieren kann. PHP bietet dafür die Funktion func_get_args(),
die alle Argumente als Array
zurückgibt, die an die Funktion übergeben wurden.
<?php
function summe() {
$zahlen = func_get_args();
return array_sum($zahlen);
/* Return value von array_sum */
}
echo summe(1, 2, 3, 4);
/* Gibt 10 aus */
In diesem Beispiel akzeptiert die Funktion summe eine beliebige Anzahl
von Argumenten, summiert diese und gibt das Ergebnis zurück.
Gültigkeitsbereich
und Kontextabhängigkeiten von PHP-Funktionen
Wenn Sie mit PHP programmieren, ist es wichtig zu verstehen, wie Variablen innerhalb und außerhalb
von Funktionen verwendet werden können. Dieses Konzept wird als „Scope“ (Gültigkeitsbereich)
einer Variablen bezeichnet. Der Scope entscheidet darüber, wo eine Variable zugänglich
ist und wo nicht. Das Verständnis dieser Grenzen hilft, Fehler zu vermeiden und die
Funktionalität Ihres Codes zu verbessern.
Grundlagen des Scopes
In PHP gibt es hauptsächlich zwei Arten von Scopes: den lokalen und den globalen
Bereich. Variablen, die innerhalb einer Funktion definiert werden, haben einen lokalen
Bereich. Das bedeutet, dass sie nur innerhalb der Funktion zugänglich
sind. Andererseits sind Variablen, die außerhalb einer Funktion definiert werden, im
globalen Bereich und können von jeder Stellen Sie des Scripts aus aufgerufen werden, jedoch nicht
sichekt innerhalb einer Funktion.
Lokaler Scope
Lokale Variablen werden in einer Funktion erstellt und können nur innerhalb
dieser Funktion verwendet werden. Sobald die Ausführung der Funktion
endet, werden diese lokalen Variablen gelöscht.
Hier ein Beispiel:
<?php
function testFunktion() {
$lokaleVariable = "Ich bin lokal!";
echo $lokaleVariable;
/* Funktioniert innerhalb dieser Funktion */
}
testFunktion();
echo $lokaleVariable;
/* Fehler! $lokaleVariable ist außerhalb dieser Funktion nicht bekannt */
In diesem Beispiel ist $lokaleVariable nur innerhalb von testFunktion zugänglich.
Ein Versuch, sie außerhalb der Funktion zu verwenden, führt zu einem Fehler, da
sie außerhalb ihres Scopes ist.
Globaler Scope
Variablen, die außerhalb jeder Funktion definiert werden, gehören zum globalen
Bereich. Diese Variablen sind überall im Script zugänglich,
außer innerhalb von Funktionen, es sei denn, sie werden explizit
als global deklariert.
<?php
$globaleVariable = "Ich bin global!";
function testFunktion() {
global $globaleVariable;
echo $globaleVariable;
/* Zugriff auf die globale Variable innerhalb einer Funktion */
}
testFunktion();
echo $globaleVariable;
/* Zugriff auch außerhalb der Funktion */
Im obigen Beispiel wird $globaleVariable sowohl innerhalb als auch außerhalb
der Funktion testFunktion verwendet. Innerhalb der Funktion muss sie
jedoch mit dem Schlüsselwort global deklariert werden.
Verwendung von Namespace
Ein Namespace in PHP dient dazu, Konflikte zwischen Namen von
Funktionen, Klassen, Konstanten oder anderen symbolischen Namen zu vermeiden, insbesondere
wenn Anwendungen groß werden oder wenn Sie externe Bibliotheken einbinden.
<?php
namespace MeinProjekt;
function test() {
echo "Hallo aus dem Namespace MeinProjekt!";
}
\MeinProjekt\test();
/* Aufruf der Funktion test() aus dem Namespace MeinProjekt */
Durch die Verwendung von Namespaces können Sie den Gültigkeitsbereich und die
Organisation von Code verbessern, indem Sie ihn in logische Abschnitte unterteilen.
Objekte in PHP-Funktionen
Neben lokalen und globalen Variablen spielen auch Objekte eine wichtige Rolle in
PHP-Funktionen, besonders wenn Sie objektorientierte Programmierung (OOP) verwenden. Objekte
sind Instanzen von Klassen, die Daten und Verhalten (durch Methoden) in einer einzigen
Einheit kapseln.
In PHP können Sie Objekte innerhalb von Funktionen verwenden, um spezifische Aufgaben zu
erledigen. Objekte unterliegen denselben Scope-Regeln wie andere Variablen: Ein Objekt, das
außerhalb einer Funktion erstellt wurde, ist innerhalb der Funktion nicht automatisch
verfügbar. Es muss als Parameter übergeben werden (empfohlen), oder über
global bzw. $GLOBALS zugänglich gemacht werden. Der Vorteil
von Objekten liegt darin, dass sie Daten und Verhalten kapseln und so als Parameter
weitergegeben werden können.
Hier ein einfaches Beispiel:
<?php
class Auto {
public $farbe = "Rot";
public function zeigeFarbe() {
echo $this->farbe;
}
}
$meinAuto = new Auto();
function farbeAnzeigen($auto) {
$auto->zeigeFarbe();
/* Zugriff auf die Methode des Objekts innerhalb der Funktion */
}
farbeAnzeigen($meinAuto);
/* Gibt 'Rot' aus */
In diesem Beispiel wird das Objekt $meinAuto der
Klasse Auto außerhalb der
Funktion farbeAnzeigen erstellt. Das Objekt wird dann der
Funktion als Parameter übergeben, und die Funktion ruft eine Methode des Objekts
auf. Dies illustriert, wie Objekte ihre Informationen durch den Code transportieren können,
was sie zu einem mächtigen Werkzeug in der objektorientierten PHP-Programmierung
macht.
Fehlermanagement
und Einschränkungen in der Funktionsverwendung
Bei der Programmierung mit PHP können Fehler passieren, besonders wenn Funktionen nicht
wie erwartet verwendet werden. Ein gutes Fehlermanagement ist daher essenziell, um robuste
und zuverlässige Anwendungen zu entwickeln. In diesem Artikel werden wir uns ansehen,
wie Sie in PHP mit Fehlern umgehen und welche Einschränkungen Sie bei der Verwendung
von Funktionen beachten sollten.
Fatal Error
Ein Fatal Error ist ein schwerwiegender Fehler, der das Ausführen
eines PHP-Skripts sofort stoppt. Solche Fehler treten auf, wenn PHP auf ein Problem stößt,
das es nicht beheben kann, wie der Aufruf einer nicht definierten Funktion oder der Zugriff
auf eine nicht verfügbare Ressource.
Beispiel für einen Fatal Error:
<?php
function addiere($a, $b) {
return $a + $b;
}
addiere(5);
/* Fatal Error: Uncaught ArgumentCountError: Too few arguments to function addiere(), 1 passed and exactly 2 expected */
In diesem Beispiel erwartet die Funktion addiere zwei Parameter. Wenn
Sie die Funktion nur mit einem Parameter aufrufen, führt das zu einem Fatal
Error, weil die erforderliche Anzahl von Argumenten nicht übergeben wurde.
Typspezifische Einschränkungen
In PHP müssen Sie manchmal sicherstellen, dass Variablen oder Rückgabewerte von
Funktionen einem bestimmten Typ entsprechen. Die Verletzung dieser Typspezifikationen kann
zu Fehlern führen.
Beispiel für typspezifische Einschränkungen:
<?php
function getDetails(array $details) {
return implode(", ", $details);
}
echo getDetails("Dies ist kein Array");
/* Fatal Error: Uncaught TypeError: Argument 1 passed to getDetails() must be of the type array, string given */
In diesem Beispiel erwartet die Funktion getDetails, dass der Parameter $details ein
Array ist. Wenn ein String übergeben wird, wird ein Fatal Error ausgelöst,
da der Typ des übergebenen Wertes nicht dem erwarteten Typ entspricht.
Konditionelle Ausführung von Funktionen
Ein weiterer wichtiger Aspekt beim Fehlermanagement ist die Überprüfung der
Bedingungen, unter denen eine Funktion ausgeführt wird. Bestimmte Codeabschnitte sollten nur unter
bestimmten Bedingungen ausgeführt werden.
Beispiel für konditionelle Ausführung:
<?php
function setAge($age) {
if ($age < 0) {
throw new InvalidArgumentException("Alter kann nicht negativ sein.");
}
echo "Alter gesetzt auf: $age Jahre";
}
try {
setAge(-5);
} catch (InvalidArgumentException $e) {
echo "Fehler: " . $e->getMessage();
/* Fehler: Alter kann nicht negativ sein. */
}
In diesem Beispiel wird überprüft, ob das Alter negativ ist, bevor es gesetzen wird.
Falls es negativ ist, wird eine Ausnahme
geworfen und der Fehler wird gefangen und behandelt.
Das Management von Fehlern und die Kenntnis von Einschränkungen sind kritische Aspekte
bei der Entwicklung von PHP-Anwendungen. Durch die Verwendung von Typangaben, das Überprüfen
von Bedingungen und das sorgfältige Handling von Fehlern können Sie sicherstellen,
dass Ihre Programme auch unter unerwarteten Bedingungen korrekt funktionieren. Dies hilft,
die Qualität und Zuverlässigkeit Ihrer Software zu verbessern.
Fortgeschrittene
Anwendungen und typische Beispiele von PHP-Funktionen
PHP bietet eine breite Palette von Funktionen, die für fortgeschrittene Anwendungen
genutzen werden können. In diesem Artikel werden wir einige fortgeschrittene Anwendungen
und typische Beispiele für die Verwendung von PHP-Funktionen erkunden. Diese Beispiele
zeigen Ihnen, wie Sie verschiedene Techniken in Ihren PHP-Code integrieren können, um
spezifische Aufgaben effizient zu lösen.
Verwendung von Funktionen zur
Datenmanipulation
PHP-Funktionen sind besonders nützlich, wenn es darum geht, Daten zu manipulieren oder
komplexe Berechnungen durchzuführen. Sie können etwa eine Funktion verwenden, um
die Summe einer Liste von Zahlen zu berechnen, die zur Laufzeit bestimmt wird.
function berechneSumme($zahlen) {
$summe = 0;
foreach ($zahlen as $zahl) {
$summe += $zahl;
}
return $summe;
}
/* Verwendung der Funktion */
$meineZahlen = [2, 3, 5, 7];
echo "Die Summe ist: " . berechneSumme($meineZahlen); /* Gibt aus: Die Summe ist: 17 */
In diesem Beispiel erstellt die Funktion berechneSumme eine Summe der
übergebenen Zahlen. Diese Funktion ist ein gutes Beispiel dafür, wie Sie eine multiple
instance (mehrfache Instanz) von Daten innerhalb einer Funktion
verarbeiten können.
Funktionen zur Validierung von Eingaben
Ein weiteres fortgeschrittenes Einsatzgebiet von PHP-Funktionen liegt in der Validierung von
Benutzereingaben. Durch die Erstellung dedizierter Funktionen zur Überprüfung der
Daten können Sie sicherstellen, dass Ihre Anwendungen robust und sicher gegenüber
fehlerhaften oder bösartigen Eingaben sind.
<?php
function validiereEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Die E-Mail-Adresse ist gültig.";
} else {
echo "Die E-Mail-Adresse ist ungültig.";
}
}
/* Verwendung der Funktion */
validiereEmail("benutzer@example.com");
/* Gibt aus: Die E-Mail-Adresse ist gültig. */
validiereEmail("benutzerexample.com");
/* Gibt aus: Die E-Mail-Adresse ist ungültig. */
Diese Funktion validiereEmail verwendet die eingebaute PHP-Funktion filter_var zur
Überprüfung der E-Mail-Adresse. Das Beispiel demonstriert, wie Sie eine Funktion
nutzen können, um die Gültigkeit der Daten zu überprüfen.
Dynamische Funktionsaufrufe
PHP ermöglicht es Ihnen, Funktionen dynamisch aufzurufen, was besonders nützlich
ist, wenn der exakte Funktionsname zum Zeitpunkt der Programmierung nicht bekannt ist. Dies
kann mit der Funktion call_user_func erreicht werden.
<?php
function gruessen() {
echo "Hallo Welt!";
}
function verabschieden() {
echo "Auf Wiedersehen!";
}
$aktion = 'gruessen';
/* Dynamischer Aufruf der Funktion basierend auf dem Wert der Variable $aktion */
call_user_func($aktion);
/* Gibt aus: Hallo Welt! */
In diesem Beispiel wird die Funktion call_user_func verwendet, um die
Funktion gruessen dynamisch aufzurufen. Dies zeigt, wie flexibel PHP
im Umgang mit Funktionen ist, besonders wenn Sie interaktive oder modulare Anwendungen
entwickeln.
Moderne PHP-Funktionen: ein Update für die nächste Stufe
Die klassische function-Syntax ist seit PHP 4 nahezu unverändert geblieben, doch was Sie heute mit Funktionen anstellen können, hat mit den fruehen Tagen wenig zu tun. Mit jedem Versionssprung sind Werkzeuge dazugekommen, die Ihren Code lesbarer, sicherer und kompakter machen. Es lohnt sich, einen Blick auf die neueren Features zu werfen, denn viele davon sind in der Praxis Gold wert und werden trotzdem oft zu wenig genutzen.
In diesem Abschnitt schauen wir uns an, wie Sie mit Type Hints, Default-Parametern, variadischen Funktionen, Named Arguments, Closures und Arrow Functions arbeiten. Anschliessend kommen die modernen Rückgabetypen, die First-class Callable Syntax und am Ende ein abgerundetes Praxisbeispiel, das alles zusammenbringt.
Type Hints für Parameter und Rückgabewerte
Funktionen ohne Typen sind wie ein Zettel ohne Adresse: sie funktionieren irgendwie, aber niemand weiß, wohin der Wert genau gehoert. Mit Type Hints machen Sie klar, welcher Datentyp rein darf und was zurueckkommt. Das verhindert eine ganze Klasse von Bugs und macht Refactoring deutlich leichter, weil Editor und IDE Ihre Absichten verstehen.
Damit PHP bei Typenkonflikten nicht heimlich konvertiert, sondern strikt prüft, setzen Sie am Dateianfang declare(strict_types=1). Die Sichektive wirkt nur in der Datei, in der sie steht, und nur für aufrufenden Code, der dort definiert ist.
<?php
declare(strict_types=1);
function rabatt(float $preis, int $prozent): float
{
return $preis * (1 - $prozent / 100);
}
echo rabatt(99.90, 15); /* 84.915 */
echo rabatt('99.90', 15); /* TypeError, weil String statt float */
?>
Mehr zu den Hintergruenden, zu Union Types und Intersection Types finden Sie im Tutorial zu Typdeklarationen. Wer Properties typisieren möchte, schaut zusaetzlich in den Beitrag zu Typed Properties.
Default-Parameter und nullable Types
Standardwerte sparen sich das ewige Schreiben gleicher Argumente. Sie geben dem Parameter sichekt in der Signatur einen Defaultwert, und Aufrufer können ihn weglassen. Wichtig: Optionale Parameter stehen rechts, Pflichtparameter links. Sonst zwingst Sie den Aufrufer, alles erneut zu setzen.
Mit dem Fragezeichen vor dem Typ erlaubst Sie zusaetzlich null als gueltigen Wert. Das nennt sich nullable Type und ist ideal für Faelle, in denen "kein Wert" eine valide Antwort ist, zum Beispiel ein optionales Suffix oder ein noch nicht gesetzener Eintrag.
<?php
declare(strict_types=1);
function gruss(string $name, ?string $titel = null, string $sprache = 'de'): string
{
$anrede = $titel !== null ? $titel . ' ' : '';
return $sprache === 'de'
? 'Hallo ' . $anrede . $name . '!'
: 'Hello ' . $anrede . $name . '!';
}
echo gruss('Maier'); /* Hallo Maier! */
echo gruss('Maier', 'Dr.'); /* Hallo Dr. Maier! */
echo gruss('Smith', null, 'en'); /* Hello Smith! */
?>
Wenn Sie sich fragen, wie Sie null in Ausdruecken elegant abfangen, lohnt sich ein Blick auf den Null Coalescing Operator.
Variadische Funktionen mit drei Punkten
Manchmal weiß man beim Funktionsschreiben nicht, wie viele Werte später ankommen. Frueher müssene man Arrays erwarten oder mit func_get_args() tricksen. Seit PHP 5.6 gibt es die variadische Schreibweise: drei Punkte vor dem letzten Parameter sammeln alle weiteren Argumente in einem Array.
<?php
declare(strict_types=1);
function summe(int ...$zahlen): int
{
$ergebnis = 0;
foreach ($zahlen as $z) {
$ergebnis += $z;
}
return $ergebnis;
}
echo summe(1, 2, 3); /* 6 */
echo summe(10, 20, 30, 40); /* 100 */
/* Auch das Entpacken eines Arrays in Parameter funktioniert */
$werte = [5, 7, 11];
echo summe(...$werte); /* 23 */
?>
Der Typhinweis int gilt dabei für jedes einzelne Element der Liste, nicht für das Array als Ganzes. Das ist ein angenehmer Unterschied zum manuellen Array-Argument, weil PHP jeden Wert beim Aufruf prüft.
Named Arguments seit PHP 8.0
Funktionen mit vielen optionalen Parametern werden schnell unleserlich, sobald Sie beim Aufruf nur einen weiter hinten liegenden Wert setzen wollen. Named Arguments loesen das Problem: Sie nennst beim Aufruf den Parameternamen und können alle anderen weglassen, sofern sie Defaults haben.
<?php
declare(strict_types=1);
function exportieren(
string $datei,
string $format = 'csv',
bool $headerZeile = true,
string $trennzeichen = ';',
string $encoding = 'UTF-8'
): bool {
/* hier wuerde der Export passieren */
return true;
}
/* Alt, ohne Named Arguments */
exportieren('kunden.csv', 'csv', true, ';', 'ISO-8859-1');
/* Neu, klar lesbar und nur das Noetige */
exportieren(
datei: 'kunden.csv',
encoding: 'ISO-8859-1'
);
?>
Auf den ersten Blick wirkt das nach Tipperei, in Wahrheit ist es ein Geschenk für die Lesbarkeit. Der Aufruf zeigt sofort, welche Option auf welchen Wert gesetzen wurde, ohne dass Sie in die Funktionsdefinition springen müssen.
Anonyme Funktionen und Closures
Eine anonyme Funktion ist eine Funktion ohne Namen, die Sie wie einen Wert in einer Variable speichern oder sichekt als Argument übergeben können. Sobald sie Variablen aus dem umgebenden Kontext mitnimmt, sprichst Sie von einer Closure. Der Mechanismus dafuer heißt use.
<?php
declare(strict_types=1);
$mwst = 19;
$bruttoBerechnen = function (float $netto) use ($mwst): float {
return $netto * (1 + $mwst / 100);
};
echo $bruttoBerechnen(100); /* 119 */
/* Per Referenz uebernommen, dann wirken Aenderungen spaeter */
$zaehler = 0;
$inkrement = function () use (&$zaehler): void {
$zaehler++;
};
$inkrement();
$inkrement();
echo $zaehler; /* 2 */
?>
Closures sind ideal für Callbacks, etwa bei Array-Funktionen oder für Strategy-Pattern. Mehr Hintergrund inklusive Closure::bind() finden Sie im Tutorial zu Closures.
Arrow Functions seit PHP 7.4
Wenn Ihre Closure aus einem einzigen Ausdruck besteht, wirkt der ganze function-Block schnell wie zu viel Drumherum. Genau dafuer gibt es Arrow Functions. Sie nutzen das Schluesselwort fn und übernehmen Variablen aus dem aeusseren Scope automatisch, ohne explizites use.
<?php
declare(strict_types=1);
$preise = [10.0, 25.50, 7.20];
$mwst = 19;
/* Klassisch */
$brutto1 = array_map(function (float $p) use ($mwst): float {
return $p * (1 + $mwst / 100);
}, $preise);
/* Kompakt mit Arrow Function */
$brutto2 = array_map(fn (float $p): float => $p * (1 + $mwst / 100), $preise);
print_r($brutto2);
?>
Arrow Functions können nur eine einzige Anweisung enthalten und geben deren Ergebnis automatisch zurueck. Genau das macht sie für kurze Transformationen so angenehm. Für alles, was Schleifen, Bedingungen oder mehrere Schritte braucht, bleibt die normale Closure die richtige Wahl.
Rückgabetypen: void, never, mixed, self und static
Neben den klassischen Rückgabetypen wie int oder string gibt es spezielle Marker, die mehr Information transportieren als nur den Datentyp.
void sagt: diese Funktion gibt nichts zurueck. Ein return ohne Wert ist erlaubt, ein return $x dagegen ein Fehler.
never bedeutet: die Funktion kehrt nicht zum Aufrufer zurueck. Sie wirft eine Exception oder beendet das Skript per exit().
mixed ist ein expliziter Joker für "wirklich jeder Typ", inklusive null. Besser als gar keinen Typ anzugeben, aber ein Hinweis darauf, dass eine engere Typisierung sinnvoll waere.
self verweist auf die aktuelle Klasse zum Definitionszeitpunkt, static auf die Klasse zur Laufzeit. Praktisch für Fluent Interfaces und Factory-Methoden in Vererbungshierarchien.
<?php
declare(strict_types=1);
function logge(string $msg): void
{
error_log($msg);
/* return; waere erlaubt, return $x ist verboten */
}
function abbrechen(string $reason): never
{
throw new RuntimeException($reason);
}
class Builder
{
public function setzen(string $key, string $value): static
{
/* ... */
return $this;
}
}
?>
First-class Callable Syntax
Seit PHP 8.1 können Sie jede Funktion oder Methode in einen Closure-Wert umwandeln, ohne sie als String zu schreiben. Die Schreibweise lautet funktionsname(...) und liefert ein Closure-Objekt.
<?php
declare(strict_types=1);
$namen = ['Anna', 'Bernd', 'Clara'];
/* Frueher: array_map('strtoupper', $namen)
Neu: typsicher und IDE-freundlich */
$gross = array_map(strtoupper(...), $namen);
print_r($gross);
class Format
{
public function trimmen(string $s): string
{
return trim($s);
}
}
$f = new Format();
$trimmer = $f->trimmen(...);
echo $trimmer(' hallo '); /* hallo */
?>
Der Vorteil: Die IDE erkennt die Referenz, statische Analyse kann prüfen, ob die Funktion wirklich existiert, und Refactoring-Tools benennen sie korrekt mit um. Bei String-Callables passiert beides nicht.
Funktionsaufruf-Lifecycle
Wenn Sie verstehen wollen, wie eine Funktion intern abgearbeitet wird, hilft eine kleine Skizze. Der Aufrufer reicht Argumente herein, PHP bindet sie an die Parameter, führt den Body aus und liefert den Rückgabewert zurueck.
flowchart TD
A[Aufruf mit Argumenten] --> B[Parameter binden und pruefen]
B --> C[Funktions-Body ausfuehren]
C --> D[return-Wert]
D --> E[Aufrufer arbeitet weiter]
An genau diesen Stationen greifen die modernen Features ein. Type Hints arbeiten beim Binden, Default-Parameter ergaenzen fehlende Werte vorher, Named Arguments steuern die Zuordnung, und der Rückgabetyp wird beim return geprüft.
Praxisbeispiel: Funktion mit Type Hints, Default und Validierung
Zum Schluss bringen wir die Bausteine in einer kleinen Funktion zusammen, wie sie in einem echten Projekt vorkommen könnte. Sie validiert eine E-Mail, optional in einer Whitelist erlaubter Domains, und nutzen einen variadischen Parameter für die Domains. Die Rückgabe ist ein Status-Array statt eines reinen Booleans, damit der Aufrufer eine Begruendung bekommt.
<?php
declare(strict_types=1);
/**
* Prueft eine E-Mail und optional ihre Domain.
*
* @return array{ok: bool, error: ?string}
*/
function pruefeEmail(string $email, bool $strikt = true, string ...$erlaubteDomains): array
{
$email = trim($email);
if ($email === '') {
return ['ok' => false, 'error' => 'leer'];
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return ['ok' => false, 'error' => 'ungueltiges Format'];
}
if ($strikt && $erlaubteDomains !== []) {
$domain = strtolower(substr(strrchr($email, '@') ?: '', 1));
$liste = array_map(strtolower(...), $erlaubteDomains);
if (!in_array($domain, $liste, true)) {
return ['ok' => false, 'error' => 'Domain nicht erlaubt'];
}
}
return ['ok' => true, 'error' => null];
}
print_r(pruefeEmail('test@example.com'));
print_r(pruefeEmail('hallo@fremd.de', true, 'php-space.info', 'example.com'));
print_r(pruefeEmail('keine-email'));
?>
Die Funktion zeigt im kleinen Format, wie sich moderne Bausteine ergaenzen. declare(strict_types=1) verhindert stille Konvertierungen, der nullable Eintrag error: ?string macht die Datenstruktur ehrlich, der variadische Parameter erlaubt einen, mehrere oder gar keine Domains, und mit strtolower(...) bekommt array_map() einen sauberen Callable. Wer das Konzept gleich auf eine Klasse uebertragen möchte, findet im Tutorial zu Constructor Promotion einen sichekten Anschluss, weil dort die gleiche Typenstrenge für Eigenschaften gilt.
Mit diesen Werkzeugen schreiben Sie Funktionen, die nicht nur arbeiten, sondern auch dokumentieren, was sie tun. Wenig Code, viel Aussage, und ein angenehmes Gefühl beim Lesen, selbst wenn der erste Wurf schon Wochen zurueckliegt.
weiter zum nächsten Kapitel:
Suchen und Ersetzen innerhalb von PHP
|