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:
getBytesFromString($allowedCharacters, $length)
ermöglicht die Generierung einer zufälligen Zeichenkette mit benutzerdefinierten erlaubten Zeichen und einer bestimmten Länge.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 durchU_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.active
,assert.bail
,assert.callback
,assert.exception
undassert.warning
wurde eingestellt - Die Verwendung von
get_class()
undget_parent_class()
ohne Argumente ist veraltet - In SQLite3 ist der Standardfehlermodus auf Exceptions gesetzt