20.04.19 3448 Views 5

credit: ©foxyburrow(stock.adobe.com)

PHP Tutorial #16

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.

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.

    Inhaltsverzeichnis

  1. In den strict-mode wechseln
  2. Typhinweise für Funktionsparameter
  3. Typhinweise für Rückgabewerte
  4. Übungen

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

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen