PHP 7.4

PHP 7.4 wird im November 2019 auf die Öffentlichkeit los gelassen. Was ist neu, und vor allem: was ist für die Umstellung zu beachten?

Zu den meisten Features oder Abkündigungen verlinke ich zum RFC, und gebe in eckigen Klammern das Abstimmungsverhältnis wieder. Ich hoffe, so auch einen Eindruck bezüglich der Unterstützung im Core Entwickler Team zu geben.

Nicht rückwärts kompatible Änderungen

  • fn ist jetzt ein reserviertes Schlüsselwort und kann nicht mehr als Funktions- oder Klassenname verwendet werden
  • BCMath Funktionen erzeugen nun eine Warnung, wenn sie auf einen nur teilweise verwertbaren String (z.B. „123blub“) stoßen. Sonst habt sich am Verhalten nichts geändert – der String wird auch weiterhin als 0 behandelt.
  • Der MySQLi Embedded Server wurde entfernt – erhat schon seit mindestens PHP 7.0 nicht mehr funktioniert
  • openssl_random_pseudo_bytes() wirft nun eine Exception bei Fehlern. Hervorzuheben ist, dass dies auch bei 0 oder weniger angeforderten Bytes der Fall ist
  • Der Versuch, eine PDO oder PDOStatement Instanz zu serialisieren, wirft nun eine Exception statt einer PDOException
  • Der versuch, ein ReflectionObject zu serialisieren, wird ebenfalls eine Exception werfen
  • Die Passwort Hashing Konstanten waren vorher Ganzzahlen, und sind jetzt nullable Strings.

Neuigkeiten

Typed Properties (RFC)

Neu ist die Typen-„bindung“ für Eigenschaften; die Gültigkeitsregeln ähneln denen für Funktions- und Methodenparameter, mit einer Ausnahme: Eigenschaftenvariablen können neben einem Wert und NULL nun auch den Wert uninitialisiert halten, wenn der Eigenschaft noch kein Wert zugewiesen wurde. Wird diese Eigenschaft gelesen, wird ein TypeError geworfen.

class User {
    public int $id;
    public ?string $name;
 
    public function __construct(int $id, ?string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

Null Coalescing Zuweisungen (RFC) [37/4]

Der Null Coalescing Operator (??) ist nun auch als Kurzschreibweise in Zuweisungen:

// The folloving lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';

Spread Operator () für Array Ausdrücke (RFC)

Für Funktionsargumente gibt es ihn schon seit PHP 5.6, jetzt ist auch die Benutzung in Array-Ausdrücken erlaubt:

$parts = ['apple', 'pear']; 
$fruits = ['banana', 'orange', ...$parts, 'watermelon']; 
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Arrow Functions (RFC) [51/8]

Die unter anderem aus ECMAScript bekannten Arrow Functions gibt es nun (im zweiten Anlauf) auch in PHP:

Vorher:

function array_values_from_keys($arr, $keys) {
    return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys);
}

Ab PHP 7.4:

function array_values_from_keys($arr, $keys) {
    return array_map(fn($x) => $arr[$x], $keys);
}

FFI (Foreign Function Interface) (RFC) [24/15]

FFI ist das direkte Bindeglied zu Binärlibraries; die Möglichkeiten sind endlos, aber auch gefährlich – deshalb auch das knappe Abstimmungsergebnis.

// create FFI object, loading libc and exporting function printf()
$ffi = FFI::cdef(
    "int printf(const char *format, ...);", // this is regular C declaration
    "libc.so.6");
// call C printf()
$ffi->printf("Hello %s!\n", "world");

Preloading (RFC) [48/0]

Mittels Preloading kann der OPCache schon während der Initialisierung befüllt werden. Das kann für einen deutlichen Performanceschub sorgen (Hello World in ZendFramework 1 ~30%, in ZendFramework 2 ~50% schneller). Da die vorgeladenen Dateien fest im OPCache verankert sind (auch opcache_reset() hilft nicht), muss php-fpm neu gestartet werden, um neuen Code zu benutzen.

Deprecations

Links-assotiativer ternärer Operator (RFC)

In vielen (fast allen) anderen Skriptsprachen ist der ternäre Operator ( Ausdruck ? WennWahr : WennFalsch ) rechts-assoziativ, und deshalb ist es das, was von den meisten Entwicklern auch in PHP erwartet wird – dem ist aber nicht so.
Um einen sauberen Schnitt zu machen, werden verschachtelte Ternaries ohne gruppierende Klammern eine Warnung erzeugen; in PHP 8 wird diese Verwendung einen Kompilierungsfehler werfen.

Et Cetera

  • ext/interbase wurde aus dem Core entfernt, weil mehr niemand diese ernsthaft warten konnte – sie ist nach PECL gewandert und muss manuell nachinstalliert werden (RFC) [46/0]
  • ext/wddx wurde mit [30/0] Stimmen vom Core nach PECL verschoben, und mit sofortiger Wirkung als veraltet markiert [19/4/2/3] (RFC)
  • ext/hash ist nun Teil des Cores, also immer verfügbar (RFC) [30/0]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert