Neue Funktionen und DEPRECATED in PHP 7.1 und PHP 7.2

PHP wird stetig erweitert und verbessert. Das bedeutet zum einen neue Features, zum anderen aber auch einige Funktionen, die nicht mehr unterstützt werden.

PHP 7.1 ist Ende 2016 erschienen und der Nachfolger PHP 7.2 soll ein Jahr später, Ende 2017, erscheinen.

PHP 7.1

Einen englischsprachigen Überblick zu den neuen Funktionen von PHP 7.1 gibt es hier. Ich stelle euch die wichtigsten Veränderungen vor.

Vorab als kleine Randnotiz: Die Closure-Klasse zur Arbeit mit anonymen Funktionen wurde in PHP 7.1 weiter verbessert.

Null-Typen und void Typen und Funktionen

In PHP könnt ihr an zwei zentralen Stellen vorgeben, was akzeptiert wird (z.B. string oder int für Integer).

Entweder als Vorgabe für einen Parameter einer Funktion:

function test(array $a) {

}

Oder als Vorgabe für den Werte-Typ, den die Funktion zurückgeben soll:

function test(): array {

}

Bei einem Verstoß dagegen kommt es zu einem Fatal Error.

In PHP kann nun für diese Typ-Angabe ein „?“ gesetzt werden (sog. nullable types). Dann darf der Typ zudem auch den Wert null haben.

function test(?array $a) {

}

function test($a): ?array {

}

Außerdem sind nun void-Funktionen, quasi als neuer Rückgabetyp, möglich. Eine void-Funktion darf gar kein return verwenden oder muss ein leeres return zurückgeben, zum Beispiel:

function test(): void {
	return;
}

Array und list() wachsen zusammen

Das Sprachkonstrukt list() ist das Paradebeispiel um Variablen leicht zu tauschen. So können etwa mehrere Array-Elementen jeweils einer Variable zugewiesen werden:

$array = array(0 => 'a', 1 => 'b');

list($a, $b) = $array;

// $a ist = 'a'
// $b ist = 'b'

In PHP 7.1 kann nun statt list() auch die shorthand Syntax für Arrays [] verwendet werden. Andersrum akzeptiert list() wie Arrays nun auch Schlüssel. Ein paar Beispiele gefällig?

$array = array(0 => 'a', 1 => 'b', 2 => 'c');

[$a, $b] = $array;

// $a ist = 'a'
// $b ist = 'b'


list(1 => $b, 2 => $c) = $array;

[1 => $b, 2 => $c] = $array;

Sichtbarkeit der Klassen-Konstanten

Eine weitere Neuerung in PHP 7.1: Konstanten in Klassen können – so wie bisher schon Klassen-Variablen und Funktionen – eine eingeschränkte Sichtbarkeit haben:

class test {
    const PUBLIC1 = 'TEST';

    public const PUBLIC2 = 'TEST';
    protected const PROTECTED = 'TEST';
    private const PRIVATE = 'TEST';
}

Fehlerbehandlung mit multi catch

Nachgebessert wurde auch bei der Fehlerbehandlung. Mittels try, catch und finally können Exceptions geworfen und aufgefangen werden, um Fehler besser zu handhaben.

Nun können in einem catch-Block auch Exceptions unterschiedlicher Typen aufgefangen werden, das sieht dann so aus:

try {
     throw new Exception('Fehler');
}

catch (Exception | ZweiterExceptionTyp $catchedException) {
     var_dump($catchedException);
}

Negative String-Schlüssel bzw. substr() verkürzt

Die Funktion substr() ist ein sinnvolles Helferlein um Zeichen aus einer Zeichenkette zu extrahieren. Das Ganze geht für einzelne Zeichen auch kürzer, zum Beispiel:

// Zeigt das 3. Zeichen an (Hinweis: [2], da ab 0 gezählt wird) //
echo "123"[2];

Nun sind auch negative Werte möglich. Sowohl bei dieser Kurzform als auch bei Funktionen wie strpos():

// Gibt 3, also das 3. letzte Zeichen aus //
echo "12345"[-3];

// Sucht nach b in den 3 letzten Zeichen //
var_dump(strpos("aabbcc", "b", -3));

Asynchrones Behandeln von Signalen

Prozessignale können mit der neuen Funktion pcntl_async_signals() auch asynchron und ohne Ticks bearbeitet werden.

Sessions mit einzigartiger Session ID

Das session-System in PHP gibt es schon lange. Bisher konnte man bereits über session_id() eine ID für die jeweilige Session setzen oder abfragen.

Dank der neuen Funktion session_create_id() kann nun eine unique (einzigartige) ID für eine Session generiert werden.

DEPRECATED/Veraltet

Kommen wir nun zu einem besonders wichtigen Teil: Den als veraltet gekennzeichneten Funktionen und Parametern. Der Einsatz dieser veralteten Teile wird zunächst eine DEPRECATED-Fehlermeldung ausspucken. In den nächsten Versionen kann dies Fatal Errors zur Folge haben, wenn die Funktionen gar nicht mehr unterstützt werden.

In den Deprecated-Informationen zu PHP 7.1 wird nochmals darauf hingewiesen, dass die mcrypt-Funktionen entfernt wurden. Stattdessen empfiehlt sich der Einsatz von openssl.

Über die Funktionen mb_ereg_replace() und mb_eregi_replace() kann nun nicht mehr per eval Code ausgeführt werden, denn der Modifikator „e“ wird nicht mehr unterstützt.

PHP 7.2

Der Zeitplan für PHP 7.2 sieht vor, dass schon im November 2017 die finale Version erscheinen soll. Ich habe für euch anhand der News– und Upgrading-Dateien schon einmal einen Blick in die Welt von PHP 7.2 geworfen.

Soweit sich in dem endgültigen Release aus dem November noch Dinge geändert haben sollten, freue ich mich über eure Anmerkungen in den Kommentaren!

BMP-Unterstützung und imageresulotion()

Vor einiger Zeit musste ich einmal BMP-Dateien mit der PHP Grafik Bibliothek (GD) erstellen. Mangels Unterstützung habe ich auf eine selbst geschrieben Funktion eines anderen PHP-Entwicklers zurückgreifen müssen.

Nun wird BMP nativ in PHP GD unterstützt mit den Funktionen imagecreatefrombmp() und imagebmp(). Tolle Sache!

Eine Weitere Neuerung ist die Möglichkeit, die Auflösung bzw. genauer die DPI-Dichte mittels imageresolution() festzulegen. Dabei lässt sich zwischen horizontal und vertikaler DPI-Dichte differenzieren. Der Standardwert für neu erstellte Dateien liegt bei 96.

Typ object unterstützt

Für die Funktionsparameter und die Ausgaben wird nun auch der Typ object unterstützt:

function test (object $a): object {

}

exif_read_data() erkennt noch mehr Daten

Die Funktion exif_read_data() kann EXIF-Informationen aus Bildern auslesen und zurückgeben. Dank PHP 7.2 werden nun deutlich mehr EXIF-Datenformate unterstützt.

Verschlüsselte ZIP-Archive unterstützt

Erst kürzlich hatte ich noch mit der Verarbeitung verschlüsselter PHP-Dateien in PHP zu tun. Daher ist mein persönliches Highlight in PHP 7.2 folgendes: Die ZIP-Bibliothek unterstützt verschlüsselte ZIP-Dateien!

Neu hinzugekommenen sind die Funktionen ZipArchive::setEncryptionIndex() und ZipArchive::setEncryptionName() um einzelne Dateien anhand Ihres Namen oder Index mit dem entsprechenden Passwort auszulesen.

Der ZIP-Stream-Kontext akzeptiert konsequenterweise ebenfalls die Übergabe eines Passworts.

PCRE-Modifikator „J“

Kleine Randnotiz: Im Rahmen der regulären Ausdrücke in PHP (PCRE) kann nun der Modifikator „J“ für die Einstellung PCRE_DUPNAMES verwendet werden.

DEPRECATED/Veraltet

Achtung, jetzt wird es wichtig! In PHP 7.2 gibt es mindestens eine besonders häufig genutzt Funktion, die ab dieser Version als veraltet gilt und möglichst zeitnah im eigenen Code ersetzt werden sollte.

Die Funktion each() gibt als Array Wert und Schlüssel eines Arrays zurück und setzt den Array-Zeiger eine Position weiter. Beliebt in älteren Skripten ist etwa folgende Form:

// Veraltet: //
$array = array('a' => 1, 'b' => 2);

while (list($key, $value) = each($array)) {
     // $key enthält jeweiligen Schlüssel (hier: 'a', 'b'), $value den jeweiligen Wert (hier: 1, 2)
}

Dabei geht es doch schon länger viel einfacher:

// Aktuell: //
$array = array('a' => 1, 'b' => 2);

foreach ($array AS $key => $value) {

}

In Zukunft sollte each() also nicht mehr verwendet werden! Die foreach-Schleife ist selbstverständlich weiterhin möglich. Andere Verhaltensweisen von each() können mit key() und next() nachgestellt werden.

Bisher war es nur eine Notice wie „Notice: Use of undefined constant … – assumed“. Nun soll es bei dem Abruf von nicht definierten Konstanten oder dem unpräzisen Abruf von definierten Konstanten eine Warning und langfristig sogar einen Error geben. Auch das kann für einige Skripte eine relevante Änderung darstellen.

Daneben noch einige kleinere Deprecated-Hinweise:

  • parse_str() kann nur noch mit beiden Parametern aufgerufen werden
  • Alias read_exif_data()
  • png2wbmp() und jpeg2wbmp()
  • gmp_random()
  • INTL_IDNA_VARIANT_2003
  • Ini-Einstellung mbstring.func_overload
  • assert() akzeptiert keine string-Parameter mehr

Fazit zu PHP 7.1 und PHP 7.2

Die beiden Updates PHP 7.1 und PHP 7.2 bringen eine Menge sinnvolle Neuerungen. Gerade bei den Typen hat sich viel getan. Außerdem wurden die GD- und ZIP-Bibliotheken erweitert und die EXIF-Funktionalität verbessert.

Gerade in PHP 7.2 gibt es allerdings Deprectated-Hinweise, die durchaus einige Webentwickler betreffen könnten.