Falconbyte unterstüzen
Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.
Thema in Kurzform
- Typhinweise können bei Funktionsparametern und Rückgabewerten eingesetzt werden.
- Vorteile: Wir erhalten mehr Kontrolle über den Code und machen ihn robuster gegenüber Bugs, die aus falscher Typübergabe bzw. Rückgabe resultieren.
In den strict-mode wechseln
PHP arbeitet standardmäßig im sog. non-scrict-mode. In diesem Modus ist es nicht möglich, bei der Definition von Variablen den Datentyp explizit festzulegen. PHP bestimmt den Datentyp aus dem Kontext.
Sehen wir uns ein Beispiel an:
$var1 = "Ich bin ein String";
$var2 = 27;
echo gettype($var1); // string
echo gettype($var2); // integer
Je nach zugewiesenem Wert (String, integer, ...) erhalten die Variablen $var1 und $var2 "automatisch" den dazu passenden Datentyp, wie wir mit gettype nachweisen konnten.
Das Problem
Dass der Datentyp bei Variablen nicht deklariert wird, ist oftmals praktisch. Bei Funktionen kann dies aber zum Problem werden. Sehen wir uns ein einfaches Beispiel an:
function addiere($a, $b){
return $a + $b;
}
Diese Funktion soll zwei Zahlen miteiander addieren und das Ergebnis zurückliefern. Das funktioniert erwartungsgemäß mit folgendem Funktionsaufruf:
echo addiere(1, 2); // gibt 3
Alles gut soweit. Was aber geschieht, wenn wir zwei Strings, sagen wir "1" und "2" der Funktion übergeben?
echo addiere("1", "2"); // gibt 3
Etwas überraschend vielleicht, dass auch dies gelingt und 3 (Datentyp: integer) ergibt. Der Grund ist, dass PHP die beiden Strings hier als Zahlen behandelt.
Selbst folgender Funktionsaufruf ist kein Problem:
echo addiere(true, "2bla"); // gibt 3
Und das geht nun wirklich zuweit!
Die Lösung: Typhinweise
Um sicherzustellen, dass nur explizit deklarierte Datentypen beim Funktionsaufruf gültig sind, gibt es seit PHP 7 die Möglichkeit, in den strict mode zu schalten und damit Typhinweise (typehints) zu verwenden.
Hierzu muss zunächst eine ganz bestimmte Anweisung ganz oben an erster Stelle innerhalb der PHP-Dateien eingebaut werden:
<?php
declare(strict_types=1);
// Rest des Codes hier...
Wir befinden uns nun im scrict mode und können Typhinweise festsetzen. Diese Typhinweise sind möglich für die Parameter und Rückgabetypen von Funktionen. Wie genau das funktioniert, sehen wir uns in den nächsten Schritten an.
Typhinweise für Funktionsparameter
Um die Datentypen der Parameter aus unserer addiere-Funktion festzuschreiben, schreiben wir den Typhinweis für den gewünschten Datentyp (z.B. int) direkt vor die Parameter-Variablen:
function addiere(int $a, int $b){
return $a + $b;
}
Nun müssen die Argumente beim Funktionsaufruf ganzzahlig Werte sein (int).
Versuchen wir dennoch, beim Funktionsaufruf andere Datentypen als int einsetzen, crasht das Programm mit der Fehlermeldung Fatal error: Uncaught TypeError: .... Dies wäre etwa hier der Fall:
addiere(3, 2.9); // Fehler!
Der zweite Parameter (2.9) ist vom Typ float, und das entspricht nicht unseren Vorgaben der Typdeklaration.
Folgende Typhinweise sind für den Anfang am Wichtigsten:
- int: für ganze Zahlen
- float: für Fließkomma-Werte
- string: für Zeichenketten
- bool: für Wahrheitswerte
Typhinweise für Rückgabewerte
Auch der Rückgabewert von Funktionen kann typdefiniert sein.
Hierzu schreiben wir einen Doppelpunkt und den Typhinweis direkt hinter die Parameterklammern. Zum Beispiel:
function addiere(int $z1, int $z2):int{
return $z1+$z2;
// return 3.2; wäre nicht möglich!
}
Der Rückgabewert muss nun ebenfalls vom Typ int sein.
Übungen
einfach
Wo liegt der Fehler im folgenden Code:
<!DOCTYPE html >
<html >
<head >
</head >
<body >
<h1 >Let the show begin!</h1 >
<?php
declare(strict_types=1);
// Rest des Codes hier..
mittel
Was ist das Ergebnis des folgenden Code:
//Code oben inkl. strict-mode-Deklaration
$var = 2;
$var2 = null;
if($var < 0){
$var2 = 1;
}
else if($var < 5){
$var2 = 1.1;
}
else if($var < 10){
$var2 = true;
}
else{
$var2 = "Hello PHP";
}
equilibrium($var2);
function equilibrium(float $para){
echo $para;
}
A. 1
B. 1.1
C. true
D. 1
E. "Hello PHP"
F. Fehler, da $var2 null ist (und damit kein float).
schwer
Was wird mit folgendem Code am Bildschirm ausgegeben?
//Code oben inkl. strict-mode-Deklaration
$w = -2;
$x = false;
for($i = 0; $i < 12; $i++){
if($i == 12){
$x = true;
}
else{
$w = 2;
}
}
echo derelicts($w, $x);
function derelicts(int $a, bool $b):string{
if($b == true){
return "$a";
}
}