PHP 8.3 Update – Features und Änderungen

von

Bildschirm mit Code

Inhalt

Diese PHP Version bringt zahlreiche neue Funktionen und Verbesserungen mit sich, die die Entwicklung von Webanwendungen mit PHP noch effizienter und leistungsfähiger machen. Deep-Cloning von schreibgeschützten Eigenschaften und bietet eine neue Funktion zur Überprüfung von JSON-Strings. Die Randomizer-Klasse wurde ebenfalls erweitert, um die Generierung von Zufallszahlen und -strings zu erleichtern.

Neue Funktionen und Verbesserungen

Typisierte Klassenkonstanten

In früheren Versionen von PHP waren Klassenkonstanten nicht typisiert, was zu Problemen führen konnte, wenn Schnittstellen oder implementierende Klassen unterschiedliche Typen für die gleiche Konstante verwendeten. Dies konnte zu unerwartetem Verhalten und potenziellen Fehlern führen.

Mit PHP 8.3 wurde die Einführung von typisierten Klassenkonstanten vorgenommen. Dies bedeutet, dass nun explizit der Typ einer Klassenkonstante angeben werden kann, um sicherzustellen, dass der gleiche Typ in der gesamten Vererbungshierarchie beibehalten wird.

Hier ist ein Beispiel, das die Problematik verdeutlicht:

interface I {
    const PHP = 'PHP 8.2';
}

class Foo implements I {
    const PHP = [];
}

In diesem Beispiel definiert das I-Interface die Klassenkonstante PHP als Zeichenkette. Die Klasse Foo implementiert das I-Interface, überschreibt jedoch die Konstante PHP mit einem leeren Array.

In PHP 8.3 kann die Typisierung der Klassenkonstanten wie folgt genutzt werden:

interface I {
    const string PHP = 'PHP 8.3';
}

class Foo implements I {
    const string PHP = [];
}

Durch die Hinzufügung des string-Typs wird jetzt ein Fehler erzeugt, da die Konstante PHP in Foo nicht mit dem erwarteten Typ übereinstimmt. Dadurch werden potenzielle Fehler vermieden und die Konsistenz des Codes verbessert.

Die Einführung typisierter Klassenkonstanten in PHP 8.3 trägt dazu bei, den Code robuster und weniger fehleranfällig zu machen, da der korrekte Typ sichergestellt wird.

Dynamisches Abrufen von Klassenkonstanten

In der Vergangenheit war es in PHP nicht möglich, Klassenkonstanten dynamisch abzurufen. Man musste den Namen der Konstanten als Zeichenkette kennen und diese dann mit der constant()-Funktion abrufen.

Hier ist ein Beispiel für die bisherige Vorgehensweise:

class Foo {
    const PHP = 'PHP 8.2';
}

$searchableConstant = 'PHP';
$constantValue = constant('Foo::' . $searchableConstant);

In PHP 8.3 wurde eine neue Methode zur dynamischen Konstantenabfrage eingeführt, die eine einfachere und sicherere Alternative bietet.

class Foo {
    const PHP = 'PHP 8.3';
}

$searchableConstant = 'PHP';
$constantValue = Foo::{$searchableConstant};

Durch die Verwendung der geschweiften Klammern {} kann nun den Wert einer Klassenkonstante basierend auf einer dynamisch generierten Zeichenkette abgerufen werden. Dies erhöht die Lesbarkeit und verhindert potenzielle Rechtschreibfehler bei der Verwendung von constant().

Das dynamische Abrufen von Klassenkonstanten ermöglicht eine flexiblere und dynamischere Verwendung von Konstanten in PHP 8.3, was die Codewartung und -erweiterung erleichtert.

Neue #[Override]-Attribute

Bei der Überschreibung von Methoden in Klassen kann es zu Problemen kommen, insbesondere wenn es zu Tippfehlern oder Namensänderungen kommt. Dies kann dazu führen, dass unbeabsichtigte neue Methoden erstellt werden und die beabsichtigte Überschreibung nicht wie erwartet funktioniert.

Um diese Problematik zu lösen, wurde in PHP 8.3 das neue #[Override]-Attribute eingeführt. Dieses Attribute kennzeichnet eine Methode in einer Klasse explizit als Absicht zur Überschreibung einer Methode in der übergeordneten Klasse oder in einem implementierten Interface.

Hier ist ein Beispiel, das die Problematik verdeutlicht:

use PHPUnitFrameworkTestCase;

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');
    }
}

In diesem Beispiel soll die Methode tearDown() die Methode der übergeordneten Klasse TestCase überschreiben, um das Dateihandle zu schließen und die temporäre Datei zu löschen. Durch einen Tippfehler im Methodennamen wurde jedoch keine Überschreibung durchgeführt.

Mit dem #[Override]-Attribute in PHP 8.3 kann die Überschreibung wie folgt markiert werden:

use PHPUnitFrameworkTestCase;

final class MyTest extends TestCase {
    protected $logFile;

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

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

Durch das Hinzufügen des #[Override]-Attributes wird deutlich, dass die Methode tearDown() eine bewusste Überschreibung einer Methode in der übergeordneten Klasse ist. Dadurch wird vermieden, dass unbeabsichtigte neue Methoden erstellt werden und die Konsistenz des Codes verbessert sich.

Das #[Override]-Attribute erleichtert die Refaktorierung und Wartung des Codes, da es sicherstellt, dass eine Methode tatsächlich die übergeordnete Methode überschreibt.

Deep-Cloning von schreibgeschützten Eigenschaften

In PHP gibt es die Möglichkeit, Eigenschaften als schreibgeschützt zu markieren, indem das readonly-Attribut verwendet wird. Diese schreibgeschützten Eigenschaften können nur im Konstruktor festgelegt werden und sind anschließend nicht mehr veränderbar. Sie bieten eine sichere Möglichkeit, Daten zu speichern und vor ungewollter Modifikation zu schützen.

In früheren Versionen von PHP gab es jedoch Einschränkungen. Wenn ein Objekt mit schreibgeschützten Eigenschaften geklont wurde, wurde lediglich eine flache Kopie der Eigenschaften erstellt. Dies bedeutete, dass die schreibgeschützten Eigenschaften weiterhin auf das Originalobjekt verwiesen und somit nicht wirklich geklont wurden.

Mit PHP 8.3 gibt es nun eine neue Möglichkeit des Deep-Cloning von schreibgeschützten Eigenschaften. Beim Klonen eines Objekts mit schreibgeschützten Eigenschaften wird nicht nur eine flache Kopie der Eigenschaften erstellt, sondern es erfolgt ein vollständige Klonen der referenzierten Objekte. Dadurch werden die schreibgeschützten Eigenschaften vollständig geklont und können unabhängig vom Originalobjekt verwendet werden.

Hier ist ein Beispiel, das die Verwendung von Deep-Cloning von schreibgeschützten Eigenschaften in PHP 8.3 verdeutlicht:

class PHP {
    public string $version = '8.2';
}

readonly class Foo {
    public function __construct(
        public PHP $php
    ) {}

    public function __clone(): void {
        $this->php = clone $this->php;
    }
}

$instance = new Foo(new PHP());
$cloned = clone $instance;

$cloned->php->version = '8.3';

In diesem Beispiel wird die Klasse Foo als schreibgeschützt deklariert und besitzt eine Eigenschaft $php vom Typ PHP. Beim Klonen des Objekts $instance wird auch die Eigenschaft $php tiefgeklont, so dass Änderungen an der Eigenschaft im geklonten Objekt keine Auswirkungen auf das ursprüngliche Objekt haben.

Die Möglichkeit des Deep-Cloning von schreibgeschützten Eigenschaften in PHP 8.3 erleichtert die Handhabung und Manipulation von Objekten mit solchen Eigenschaften erheblich. Es kann nun sichergestellt werden, dass schreibgeschützte Daten vollständig geklont und unabhängig vom Originalobjekt verwendet werden können.

Neue Funktion json_validate()

Die Überprüfung der Syntax und Gültigkeit von JSON-Strings war in früheren Versionen von PHP mit einigen Herausforderungen verbunden. Die Verwendung der json_decode()-Funktion allein bietet keine explizite Möglichkeit, festzustellen, ob ein JSON-String syntaktisch korrekt ist oder nicht. Dies kann zu Fehlern und unerwartetem Verhalten führen, insbesondere wenn die Integrität von JSON-Daten wichtig ist.

In PHP 8.3 wurde die Funktion json_validate() eingeführt, um dieses Problem zu lösen. Diese Funktion ermöglicht es, die Syntax und Gültigkeit eines JSON-Strings zu überprüfen, ohne die Daten vollständig zu decodieren.

Hier ist ein Beispiel, das die Verwendung der json_validate()-Funktion in PHP 8.3 verdeutlicht:

$jsonString = '{ "test": { "foo": "bar" } }';
$result = json_validate($jsonString);

var_dump($result); // bool(true)

In diesem Beispiel wird der JSON-String { "test": { "foo": "bar" } } mit der json_validate()-Funktion überprüft. Das Ergebnis ist ein boolscher Wert, der angibt, ob der JSON-String syntaktisch korrekt ist oder nicht.

Die Einführung der json_validate()-Funktion in PHP 8.3 bietet eine einfache und effektive Möglichkeit, die Gültigkeit von JSON-Strings zu überprüfen, ohne die Daten zu decodieren. Dadurch kann sichergestellt werden, dass die Daten, mit denen gearbeitet wird, ordnungsgemäß formatiert und gültig sind, bevor sie weitere Verarbeitungsschritte durchführen.

Die Verwendung der neuen json_validate()-Funktion verbessert die Qualität und Zuverlässigkeit von PHP-Anwendungen, die mit JSON-Daten arbeiten. Sie ist eine nützliche Ergänzung des PHP-Ökosystems und erleichtert die Handhabung von JSON-Strings in der Entwicklungspraxis.

Neue Methoden in der Randomizer-Klasse

Die Randomizer-Klasse in PHP bietet eine Vielzahl von Funktionen zur Generierung von Zufallszahlen und -strings. Diese Klasse wurde in PHP 8.3 um einige neue Methoden erweitert, die weitere Möglichkeiten zur Generierung von Zufallswerten bieten.

Die Randomizer-Klasse ist Teil der Random-Erweiterung in PHP und ermöglicht die Generierung von Zufallswerten basierend auf verschiedenen Algorithmen. Sie bietet eine Reihe von Methoden wie getRandomBytes()getInt()getIntRange() und andere. Mit diesen Methoden können Zufallszahlen, Binärdaten und zufällige Zeichenketten generiert werden.

In PHP 8.3 wurden der Randomizer-Klasse zwei neue Methoden hinzugefügt:

  1. getBytesFromString($allowedCharacters, $length) ermöglicht die Generierung einer zufälligen Zeichenkette mit benutzerdefinierten erlaubten Zeichen und einer bestimmten Länge.
  2. getFloat($min, $max, $boundary) ermöglicht die Generierung einer zufälligen Gleitkommazahl innerhalb eines bestimmten Bereichs.

Diese neuen Methoden erweitern die Funktionalität der Randomizer-Klasse und bieten zusätzliche Möglichkeiten zur Generierung von Zufallswerten. Sie können in verschiedenen Szenarien nützlich sein, beispielsweise bei der Generierung von eindeutigen Identifikatoren, Passwörtern oder Testdaten in PHP-Anwendungen.

Hier ist ein Beispiel, das die Verwendung der neuen Methoden in der Randomizer-Klasse zeigt:

$randomizer = new RandomRandomizer();

// Generierung einer zufälligen Zeichenkette
$randomString = $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16);

// Generierung einer zufälligen Gleitkommazahl
$randomFloat = $randomizer->getFloat(0.0, 1.0, RandomIntervalBoundary::ClosedOpen);

In diesem Beispiel wird mithilfe der Randomizer-Klasse eine zufällige Zeichenkette mit einer Länge von 16 Zeichen erzeugt, die nur aus Buchstaben und Zahlen besteht. Anschließend wird eine zufällige Gleitkommazahl im Bereich von 0.0 bis 1.0 generiert.

Die neuen Methoden in der Randomizer-Klasse erweitern die Möglichkeiten zur Generierung von Zufallswerten in PHP-Anwendungen. Sie bieten eine einfache und effektive Möglichkeit, zufällige Werte zu generieren, die in verschiedenen Szenarien nützlich sein können.

Verbesserungen im Kommandozeilen-Linter

Der Kommandozeilen-Linter ist ein nützliches Tool in PHP, das entwickelt wurde, um den Code auf potenzielle Syntaxfehler und Probleme zu überprüfen, bevor er ausgeführt wird. Mit dem Kommandozeilen-Linter können Entwickler schnell und einfach Code-Fehler identifizieren und beheben, was dazu beiträgt, robustere und fehlerfreie Anwendungen zu erstellen.

In PHP 8.3 gab es Verbesserungen im Kommandozeilen-Linter, die die Verarbeitung mehrerer Dateien unterstützen. Das bedeutet, dass nun mehrere Dateien gleichzeitig mit dem Kommandozeilen-Linter überprüft werden können, um potenzielle Fehler im Code zu finden.

Hier ist ein Beispiel, das die Verwendung des Kommandozeilen-Linters mit der Unterstützung mehrerer Dateien in PHP 8.3 zeigt:

php -l foo.php bar.php

In diesem Beispiel werden die Dateien foo.php und bar.php mit dem Kommandozeilen-Linter überprüft. Das Ergebnis wird für jede Datei einzeln ausgegeben, wobei angezeigt wird, ob Syntaxfehler gefunden wurden oder nicht.

Die Verbesserungen im Kommandozeilen-Linter in PHP 8.3 bietet den Vorteil, mehrere Dateien effizient auf Syntaxfehler und Probleme zu überprüfen. Dies spart Zeit und ermöglicht eine schnellere Fehlerbehebung im Entwicklungsprozess.

Die Anwendung der Verbesserungen im Kommandozeilen-Linter ist einfach: Geben Sie einfach die Dateinamen als Argumente für den Linter-Befehl an und lassen Sie ihn seine Arbeit erledigen. Dadurch können potenzielle Probleme im Code frühzeitig identifiziert und behoben werden

Weitere Neuerungen und Änderungen

In PHP 8.3 gibt es neben den bereits erwähnten neuen Funktionen und Verbesserungen auch eine Vielzahl weiterer Neuerungen in Form von neuen Klassen, Schnittstellen und Funktionen. Diese Erweiterungen bieten zusätzliche Möglichkeiten und Funktionen, um PHP-Anwendungen noch effektiver und leistungsfähiger zu machen.

Neue Klassen, Schnittstellen und Funktionen

Hier ist eine Auflistung einiger dieser neuen Klassen, Schnittstellen und Funktionen in PHP 8.3:

  • Neue Methoden der DOMElement-Klasse: getAttributeNames()insertAdjacentElement()insertAdjacentText()toggleAttribute()
  • Neue Methoden der DOMNode-Klasse: contains()getRootNode()isEqualNode()
  • Neue Methode der DOMNameSpaceNode-Klasse: contains()
  • Neue Methode der DOMParentNode-Klasse: replaceChildren()
  • Neue Methoden der IntlCalendar-Klasse: setDate()setDateTime()
  • Neue Methoden der IntlGregorianCalendar-Klasse: createFromDate()createFromDateTime()
  • Neue Funktionen zur LDAP-Kommunikation: ldap_connect_wallet()ldap_exop_sync()
  • Neue Funktion mb_str_pad()
  • Neue Funktionen zur POSIX-Kompatibilität: posix_sysconf()posix_pathconf()posix_fpathconf()posix_eaccess()
  • Neue Methode der ReflectionMethod-Klasse: createFromMethodName()
  • Neue Funktionen für Sockets: socket_atmark()
  • Neue Funktionen zur Zeichenkettenmanipulation: str_increment()str_decrement()
  • Neue Funktion zur Bearbeitung von Stream-Kontext-Optionen: stream_context_set_options()
  • Neue Methode der ZipArchive-Klasse: getArchiveFlag()
  • Unterstützung für die Generierung von EC-Schlüsseln mit benutzerdefinierten EC-Parametern in der OpenSSL-Erweiterung
  • Neue INI-Einstellung zend.max_allowed_stack_size, um die maximale erlaubte Stapelgröße festzulegen
  • Die „php.ini“ unterstützt nun eine Fallback-/Standardwert-Syntax
  • Anonyme Klassen können nun als schreibgeschützt (readonly) markiert werden

Wichtige Deprecations

Zusätzlich zu den neuen Funktionen und Erweiterungen gibt es auch einige Deprecations und Abwärtskompatibilitätsbrüche in PHP 8.3.

  • Änderungen im Umgang mit negativen Array-Indizes bei leeren Arrays
  • Änderungen an der range()-Funktion
  • Änderungen bei der Wiederdeklaration statischer Eigenschaften in Traits
  • Die Konstante U_MULTIPLE_DECIMAL_SEPERATORS ist veraltet und wurde durch U_MULTIPLE_DECIMAL_SEPARATORS ersetzt
  • Die MT_RAND_PHP-Mt19937-Variante ist veraltet
  • Die Methode ReflectionClass::getStaticProperties() ist nicht mehr nullable
  • Entwicklung von INI-Einstellungen wie assert.activeassert.bailassert.callbackassert.exception und assert.warning wurde eingestellt
  • Die Verwendung von get_class() und get_parent_class() ohne Argumente ist veraltet
  • In SQLite3 ist der Standardfehlermodus auf Exceptions gesetzt

weitere Infos

PHP: PHP 8.3.0 Release Announcement

PHP: PHP 8 ChangeLog

PHP: Downloads

PHP: Migration von PHP 8.2.x auf PHP 8.3.x – Manual

War der Inhalt hilfreich?

Wir freuen wir uns sehr über ein kurzes Feedback.

Ähnliche Artikel:
VABELHAVT
Lars Boob

Lars Boob

Webdesigner & Online Marketing Experte

gerade nicht online

Lars Boob
Hallo! Wie kann ich Ihnen weiterhelfen?
Nachricht schicken
chat