PHP 8.3 – Performance-Verbesserungen, neue Funktionen und Inkompatibilitäten

Philipp Zeder
Autor:

Philipp Zeder

Kategorie:

in

Entwicklung & Performance

Veröffentlicht am 21. Feb. 2024

PHP 8.3 ist das neueste Update für die beliebte Scriptsprache und Ende 2023 offiziell erschienen. Ab sofort kannst du PHP 8.3 auf deinem cyon-Hosting nutzen. Neben Leistungsverbesserungen, Fehlerbehebungen und allgemeiner Aufräumarbeiten bringt PHP 8.3 viele neue Funktionen mit sich. Wir werfen einen Blick auf die wichtigsten Neuerungen.

Titelbild «PHP 8.3 – Neue Funktionen, Performance-Verbesserungen und Inkompatibilitäten»

Performance-Verbesserungen

Die PHP Group meldet einige Verbesserungen in Sachen Performance. So wurden einige DOM-Operationen verbessert, die damit weniger Ausführungszeit für die gleichen Aufgaben benötigen. Ausserdem ist die Fehlerprüfung für file()-Flags nun bis zu 7 % schneller als noch mit PHP 8.2. Schlussendlich gibt es auch Verbesserungen in der Standard PHP Library (SPL): Die Klasse RecursiveDirectoryIterator verursacht nun weniger I/O, wenn über ein Verzeichnis geloopt wird.

Die Website OnlinePHP.io meldet in ihren Benchmarks einen leichten Geschwindigkeitsgewinn von PHP 8.2 zu PHP 8.3. Im Vergleich zu früheren Versionen sind die Geschwindigkeitsverbesserungen allerdings nicht mehr ganz so gross. Das lässt darauf schliessen, dass PHP mittlerweile schon Nahe am Optimum ist. Im Zusammenspiel mit den Neuerungen bleibt ein Wechsel auf die neueste PHP-Version weiterhin attraktiv.

Die 3 besten neuen Funktionen in PHP 8.3

Neben den Performance-Verbesserungen bringt PHP 8.3 einen ganzen Strauss an neuen Funktionen mit. Unsere 3 Favoriten:

Das neue #[\Override]-Attribut

Setzt du das neue Attribut bei einer Methode ein, stellt PHP nun sicher, dass diese Methode in einer Elternklasse oder einem implementierten Interface vorhanden ist. Das Attribut legt fest, dass das Überschreiben der Methode absichtlich erfolgt ist. Das erleichtert ein Refactoring, da ein Fehler geworfen wird, falls die überschriebene Methode in der Elternklasse nicht vorhanden ist.

Vor PHP 8.3:

use PHPUnit\Framework\TestCase;

final class MyTest extends TestCase {
    protected $logFile;

    protected function setUp(): void {
        $this->logFile = fopen('/tmp/logfile', 'w');
    }

    protected function taerDown(): void {
        fclose($this->logFile);
        unlink('/tmp/logfile');
    }
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).

Ab PHP 8.3:

use PHPUnit\Framework\TestCase;

final class MyTest extends TestCase {
    protected $logFile;

    protected function setUp(): void {
        $this->logFile = fopen('/tmp/logfile', 'w');
    }

    #[\Override]
    protected function taerDown(): void {
        fclose($this->logFile);
        unlink('/tmp/logfile');
    }
}

// Fatal error: MyTest::taerDown() has #[\Override] attribute,
// but no matching parent method exists

Neue Funktion json_validate()

Dank der neuen Funktion json_validate() prüfst du die Syntax von JSON viel effizienter als noch mit json_decode():

Vor PHP 8.3:

function json_validate(string $string): bool {
    json_decode($string);

    return json_last_error() === JSON_ERROR_NONE;
}

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

Ab PHP 8.3:

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

Neue Methode Randomizer::getBytesFromString()

Bereits PHP 8.2 brachte eine komplett neue Funktion, mit der du zufällige Zahlen generieren kannst. Mit PHP 8.3 werden die Möglichkeiten mit Randomizer noch grösser. Die neue Methode Randomizer::getBytesFromString() hilft dir bei der Generierung von Zufallszahlen und -zeichenfolgen. Um zum Beispiel zufällige Domainnamen zu erzeugen sind nun deutlich weniger Zeilen Code nötig (Beispiel von php.net):

Vor PHP 8.3:

// This function needs to be manually implemented.
function getBytesFromString(string $string, int $length) {
    $stringLength = strlen($string);

    $result = '';
    for ($i = 0; $i < $length; $i++) {
        // random_int is not seedable for testing, but secure.
        $result .= $string[random_int(0, $stringLength - 1)];
    }

    return $result;
}

$randomDomain = sprintf(
    "%s.example.com",
    getBytesFromString(
        'abcdefghijklmnopqrstuvwxyz0123456789',
        16,
    ),
);

echo $randomDomain;

Ab PHP 8.3:

// A \Random\Engine may be passed for seeding,
// the default is the secure engine.
$randomizer = new \Random\Randomizer();

$randomDomain = sprintf(
    "%s.example.com",
    $randomizer->getBytesFromString(
        'abcdefghijklmnopqrstuvwxyz0123456789',
        16,
    ),
);

echo $randomDomain;

Selbstverständlich sind das nicht alle neuen Funktionen von PHP 8.3. Alle oben erwähnten Code-Beispiele und eine gute Übersicht über alle Neuerungen findest du auf der Release-Seite der PHP Group zur neuen Version.

Inkompatibilitäten zu älteren PHP-Versionen

Es ist wichtig, die Inkompatibilitäten zu berücksichtigen, wenn du von PHP 8.2 auf 8.3 aktualisierst. Überprüfe deine Anwendungen sorgfältig, um sicherzustellen, dass sie auch mit PHP 8.3 reibungslos funktionieren. Einen Leitfaden für den Wechsel von PHP 8.2 zu 8.3 sowie alle weiteren wichtigen Informationen findest du im passenden Migrations-Guide der PHP Group und auf der Release-Seite im Abschnitt «Veraltete Funktionalität und inkompatible Änderungen zu vorherigen PHP Versionen».

PHP 8.3 bringt die beliebte Scriptsprache wieder ein Stückchen weiter. Hast du die Version bereits getestet? Was sind aus deiner Sicht die spannendsten Neuerungen? Wir freuen uns über deinen Kommentar.

Titelbild: Ben Griffiths/Unsplash & eigene Bearbeitung

Beteilige dich an der Diskussion

Kommentare