Die wichtigsten Neuerungen in PHP 7.0.0

Nach über 11 Jahren veröffentlichte das PHP Team am 3. Dezember 2015 ein lang ersehntes neues Major Release zu Ihrer Programmiersprache. 11 Jahre in denen die Web-Community mit PHP 5.x (die erste Version wurde am 13. Juli 2004 veröffentlicht) durchhalten musste. Diese lange Entwicklungszeit erklärt sich mit dem gescheiterten Versuch von Version 6.0 und der damit verbundenen nativen Unterstützung von UTF-16. Denn damals, 2005 als die Arbeiten an einem Nachfolger begangen, gab es bei den anwendbaren Zeichensätzen noch keinen "Quasi-Standard". PHP setzte damit auf ein falsches Pferd, denn wenige Jahre darauf wurde der Unicode UTF-8 endgültig auserkoren. Die Arbeiten waren allerdings nicht vollends vergeben, denn viele Änderungen und Funktionen haben es in den PHP 5.x Versionsstrang geschafft und wurden bzw. werden nun laufend mit PHP 7.x ausgearbeitet und veröffentlicht.

Die größte Neuerung soll dem PHP Fork "Hack" von FaceBook die Stirn bieten, welcher aufgrund der schlechten Performance sowie aber auch der schwachen Typisierung seitens PHP entwickelt wurde. Dies wird durch die Entwicklung der neuen PHP Compiler Software Zend Engine 3 ermöglicht, welche neben einer 64-BIT INT Unterstützung für Windows auch mit einer "bis zu doppelt so schnellen" Performance (im Vergleich zu PHP 5.6) daher kommt.

Weitere Neuerungen

Mit dem Release von PHP 7.0.0 wird natürlich nicht nur die Performanz auf ein neues Level gebracht, sondern auch die ein oder andere durchaus nützliche Funktion hält Einzug in das Sprachkonstrukt. Darunter fallen:

Typendeklaration

Absofort können die Typen der einzelnen Funktionsparameter sowie der Typ des Rückgabewerts einer Funktion festgelegt werden. Die Anzahl der Typenangaben beschränkt sich auf callable, array, string, bool, int und float. Sogenannte Nullable Types, also Typendeklarationen die entweder den Typ oder null erlauben, sowie Union Types, die Nutzung mehrerer Typen (meistens durch ein | getrennt), sind allerdings nicht möglich.

Richtig sinnig wird die Typendeklaration allerdings auch erst mit der zusätzlichen Setzung der strict_types Option, welche über die declare Funktion global als erste Zeile einer jeden PHP Datei festgelegt werden muss. Denn erst damit wird eine Fehlermeldung ausgegeben (Exception), und die weitere Ausführung des Skripts unterbrochen.

<?php
    declare(strict_types=1);

    function my_function(string $string, int $int): string {
        return $string . " - " . $int;
    }

    print( my_function("Zeichenkette", 12) );      // Ausgabe: "Zeichenkette - 12"
    print( my_function(false, 12) );               // Fataler Fehler (Exception)

Null Koaleszenz-Operator

Der neue ?? Operator vereinfacht die Prüfung einer Variable und funktioniert grundlegend wie die isset() Funktion. Wenn die Variable also existiert und nicht den Wert null besitzt wird diese selbst zurückgegeben, falls nicht erscheint der entsprechend andere Wert. Dies funktioniert natürlich auch innerhalb eines (multidimensionalen) Arrays und auch eine Verkettung mehrerer Möglichkeiten kann angewendet werden, wie folgendes Beispiel zeigt.

<?php

    $array = [
        "value1" => null,
        "value2" => " Welt"
    ];

    print( $array["value1"] ?? "Hallo" );           // Gibt "Hallo" aus
    print( $array["value2"] ?? " Deny" );           // Gibt " Welt" aus
    print( $array["value3"]["nonexist"] ?? "!" );   // Gibt "!" aus


    if( ( $_GET["value_1"] ?? $_GET["value_2"] ?? "off" ) == "off" ) {
        // Innerhalb eines Statements müssen die Angaben 
        // in einer Klammer zusammengefasst werden.
    }

Anonyme Klassen

Mit PHP 5.3.0 wurden anonyme Funktionen eingebunden, PHP 7.0.0 kommt nun auch mit anonymen Klassen daher. Das Sprachkonstrukt initiiert dabei direkt die erste Instanz, erfordert also etwaige Parameter für den Konstruktor, weitere Instanzen können über die entsprechende zugewiesene Variable erstellt werden.

<?php

    $value = "Lenivyy";
    $class = new class($value) {
        public function __construct($name){
            echo "Hello {$name}!\n";
        }
    };

    $other = new $class("Sunshine");

Neue Zufallsgenerator

Die neuen Funktionen random_int und random_bytes erlauben eine kraptografisch-sichere Generierung pseudo-zufälliger Zahlen respektive Zeichenketten. Gerade die zweite Funktion erweist sich als durchaus nützlich für die Erstellung von SALT Werten, für die weitere Errechnung eines Password Hashes, oder auch für (CSRF) Tokens aller Art.

Im Vergleich zu der vorher genutzten openssl_random_pseudo_bytes() Funktion benötigt random_bytes() auch keine zusätzliche Software (wie OpenSSL) zur Erstellung, sondern greift auf die Systemeigenen Funktionen zurück, wovon gerade Windows aufgrund der dadurch gewonnenen Zeit profitiert.

<?php

    print( bin2hex( random_bytes( 5 ) ) );		// Ausgabe: 10-stelliger String

Konstanten und Spaceship-Operator

Zum Abschluss noch zwei kleine Änderungen: Die define() Funktion akzeptiert nun auch Arrays als Wert für deine Konstanten und PHP 7.0 unterstützt nun auch den, aus anderen Programmiersprachen bekannten, Spaceship Operator. Dieser Operator prüft ob ein Wert niedriger, gleich oder größer eines anderen Wertes ist und gibt dementsprechend 1, 0 oder -1 aus.

<?php

    define("TIME", [
        "10:20",
        "11:20",
        "12:20"
    ]);


    echo 1 <=> 0;               // Gibt  1 aus
    echo 1 <=> 1;               // Gibt  0 aus
    echo 1 <=> 2;               // Gibt -1 aus

    echo "11:20" <=> TIME[0];   // Gibt  1 aus
    echo "11:20" <=> TIME[1];   // Gibt  0 aus
    echo "11:20" <=> TIME[2];   // Gibt -1 aus

Weitere Informationen zum neuen PHP Update findest du auf php.net.