Jetzt anmelden...

Name
Passwort
Registrieren

PHP Tutorial #13

Typhinweise mit declare strict

Seit der PHP Version 7 ist es möglich, Datentypen bei Parametern und Rückgabewerten strikt zu kontrollieren. Wir zeigen Ihnen, welche Vorteile dieses "Killerfeature" hat und wie wir es einsetzen können.

Kommentare [0]

Stefan 20.04.2019

Infos zum Artikel

Kategorie PHP
Autor Stefan
Datum 20.04.2019

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..

Lösung ein-/ausblenden

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).

Lösung ein-/ausblenden

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";
       }
}
Lösung ein-/ausblenden

Kommentar schreiben

Nur angemeldete Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Mehr zu Parametern

Was sind variabler Parameterlisten und optionale Parameter?

Rekursive Funktionen

Eine rekursive Funktion ist eine Funktion, die sich selbst wiederaufruft.

Scope von Variablen

Wo ist eine Variable eigentlich sichtbar?

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen