Neue Funktionen
Werfen wir zunächst einen Blick auf einige der neuen Funktionen, die für PHP-Entwickler von Interesse sein werden. Dies ist keine vollständige Liste der neuen Leckerbissen. Es ist viel mehr eine kurze Liste der Dinge, woran meiner Meinung nach die Mehrheit der PHP-Entwickler interessiert sein wird.
readonly Klassen
In PHP 8.1 haben wir readonly-Eigenschaften für Klassen gekriegt. Dies war ein großer Schritt nach vorn für viele Projekte. Allerdings gab es noch ein kleines Problem, das behoben werden musste – Klassen. Ja, man kann jede eingetippte Eigenschaft in einer Klasse readonly machen und fertig, aber ehrlich gesagt erfordert das eine Menge Tippen und wenn wir etwas Bescheid wissen, ist es dass Entwickler ziemlich faul sind. Mit PHP 8.2 können wir stattdessen eine ganze Klasse als readonly kennzeichnen.
readonly class MyClass {
public int $myProp;
public string $myOtherProp;
public __construct(string $myOtherProp, int $myProp)
{
$this->myProp = $myProp;
$this->myOtherProp = $myOtherProp;
}
}
Hier haben wir eine Klasse, die als readonly definiert ist. Wir haben 2 Eigenschaften der Klasse und beide sind als readonly eingestellt. Die Readonly-Regeln aus PHP 8.1 gelten weiterhin. Sie können die Eigenschaft einmal initialisieren, danach ist sie gesetzt.
$myObj = new MyClass(‘Cal was here’,42);
Sobald sie jedoch initialisiert sind, sind sie unveränderlich.
$myObj->myProp = ‘Cal is no longer here’;
// Fatal Error: Uncaught Error: Cannot modify readonly property MyClass::myProp
Eine weitere Eigenschaft der Readonly-Klasse ist, dass der Klasse niemals dynamisch Eigenschaften hinzugefügt werden können. Im Folgenden sprechen wir über die Abschaffung der dynamischen Eigenschaften und warum dies eine gute Sache ist. Es gibt sogar eine Annotation, mit der Sie diese Funktion deaktivieren können. Wenn Sie jedoch eine Klasse als readonly kennzeichnen, kann sie nicht geändert werden.
Konstanten in Traits (Eigenschaften)
Traits gibt es in PHP bereits seit PHP 5.4. Sie waren lange Zeit die Antwort der Sprache auf “Komposition statt Vererbung”. Jetzt erhalten Traits eine interessante neue Funktion, nämlich die Möglichkeit, Konstanten in einem Trait zu definieren.
trait MyTrait {
private const MY_CONSTANT = 42;
}
Wenn Ihr Trait nun eine Konstante verwendet, können Sie diese im Trait definieren und müssen nicht jedes Mal daran denken, sie zusätzlich in jeder Klasse zu definieren, die den Trait verwendet.
trait MyTrait {
private const MY_CONSTANT = 42;
public function meaningOfLife() : int
{
return self::MY_CONSTANT;
}
}
class MyClass {
use MyTrait;
}
$myObj = new MyClass();
echo $myObj->meaningOfLife(); // prints 42
Wie bei allem im Leben gibt es auch hier einige Regeln.
Traits können Klassenkonstanten definieren. Wenn eine Klasse diese Eigenschaft verwendet, kann sie auch dieselbe Klassenkonstante definieren, solange sowohl die Sichtbarkeit als auch der Wert genau gleich sind. Das obige Beispiel funktioniert also, aber das folgende führt zu einem Fatal Fehler
trait MyTrait {
private const MY_CONSTANT = 42;
public function meaningOfLife() : int
{
return self::MY_CONSTANT;
}
}
class MyClass {
use MyTrait;
public const MY_CONSTANT = 42;
}
Trotz aller Regeln, die Sie befolgen müssen, ist dies ein echter Schritt nach vorn. Traits sind eine großartige Möglichkeit, Code zwischen Klassen zu teilen, und jetzt sind sie sogar noch eigenständiger.
Random Extension 5.x + Verbesserung der Random Extension
Der ursprüngliche PHP-Zufallszahlengenerator ist immer noch im Basiscode enthalten. Er war noch nie großartig und ist für kryptografische Zwecke absolut unbrauchbar. In PHP 7 gibt es ein paar neue Funktionen, random_int() und random_bytes(). Es wurde viel getan, um die Probleme zu beheben, aber unter der Oberfläche handelt es sich lediglich um Schnittstellen zum Zufallszahlengenerator des Betriebssystems. Damals war dies eine gute Lösung, aber das Problem ist immer noch die Langsamkeit.
Mit PHP 8.2 erhalten wir nicht nur einen völlig neuen Zufallszahlengenerator, er ist in PHP integriert, und wir erhalten eine objektorientierte Schnittstelle zu ihm.
Es handelt sich eigentlich um zwei verschiedene RFCs, die ich zusammenfasse. Nachdem über die erste “Random Extension 5.x” abgestimmt und sie verabschiedet worden war, wurde festgestellt, dass es einige Probleme damit gab. Ein zweiter RFC, “Random Extension Improvement”, war vorbereitet und abgestimmt, um die Probleme zu beheben, die im ersten RFC gefunden wurden.
Das Endergebnis ist ein neuer Satz von Klassen, der uns bessere Pseudo-Zufallszahlen in PHP ermöglicht.
Wir bekommen zwar einige neuen Zufallszahlengeneratoren oder Random Number Genrator (RNG), aber der Einfachheit halber werde ich nur die neue Klasse Random\Engine\Secure behandeln.
$engine = new Random\Engine\Secure();
$randomString = $engine->generate(); // a random binary string
echo bin2hex($randomString);
Wenn wir nun ein Array sortieren wollen, brauchen wir eines der neuen Randomizer-Objekte.
$randomizer = new Random\Randomizer($engine);
$items = range(1, 10);
$randomizedItems = $randomizer->shuffleArray($items);
print_r($randomizedItems);
Im obigen Beispiel haben wir Secure-Engine verwendet. Secure Engine akzeptiert keinen Seed und erzeugt immer eine nicht reproduzierbare Zeichenfolge. Die Engines, bei denen Sie einen Seed angeben können, liefern jedes Mal die gleichen Ergebnisse, wenn Sie denselben Seed verwenden.
Die Randomizer-Klasse bietet auch mehrere andere Methoden, die PHP-Entwickler suchen.
- getInt() : int
Dies ersetzt die alte mt_rand() Funktion
- getInt(int $min, int $max) : int
Dies ersetzt sowohl die alte Funktion mt_rand() als auch die neuere Funktion random_int()
- getBytes(int length): string
Dies ersetzt die random_bytes() Funktion
- shuffleArray(array $array): array
Dies ersetzt die alte shuffle_array() Funktion
- shuffleString(string $string): string
Dies ersetzt die alte str_shuffle() Funktion
Da dies unter anderem die gesamte Zufallsfunktionalität in einem einzigen Bereich des Engines zusammenfasst, wird der Kerncode optimiert und weitere Verbesserungen werden einfacher.
“Vielen Dank für die Blumen”
Alle guten Dinge müssen ein Ende haben und das gilt auch für einige Funktionen und Befehle von PHP. Sehen wir uns einige wichtige veraltete Funktionen an, die Ihnen Probleme bereiten könnten, wenn Sie nicht aufpassen.
Veralteten Dynamische Eigenschaften
Auf den ersten Blick scheint es sich hier um ein großes Problem zu handeln. Seit es das aktuelle Objektmodell in PHP gibt, ist es möglich, jederzeit Eigenschaften zu einem Objekt hinzuzufügen. Jetzt könnte jemand denkt, dass dieses Verhalten eine schlechte Sache ist. (HINWEIS: Es war schon immer schlecht, aber viele Entwickler haben es ausgenutzt).
class MyClass {
public string $name;
}
$myObj = new MyClass():
$myObj->nmae = ‘Cal Evans’;
Beachten Sie, dass ich den Namen der Eigenschaft falsch geschrieben habe. Ich weiß, dass ich wahrscheinlich der einzige Entwickler bin, der einen Eigenschaftsnamen falsch geschrieben hat, aber wenn das in PHP passiert, bekomme ich eine neue Eigenschaft für das Objekt und die ursprüngliche Eigenschaft bleibt unverändert. Das war nicht meine Absicht.
Ab PHP 8.2 wird dies eine Warnung ausgeben, dass es DEPRECATED (abgelehnt) ist.
Es gibt 3 Ausnahmen zu dieser neuen Regel.
- Jeder Eintrag von StdClass kann weiterhin dynamische Eigenschaften annehmen.
- Jede Klasse mit den magischen __get()- und __set()-Methoden akzeptiert weiterhin jede Eigenschaft.
- Jede Klasse mit der Compiler-Annotation #[AllowDynamicProperties] und jede untergeordnete Klasse erlaubt das Setzen von dynamischen Eigenschaften.
Für diejenigen, die auf diese “Funktion” von PHP angewiesen sind, ist zwar noch nicht alles verloren, aber wenn Sie es weiterhin verwenden wollen, müssen Sie einige Änderungen an Ihrem Code vornehmen.
Die gute Nachricht ist, dass im Moment die Warnung nur in den Protokolldateien ausgegeben wird. Auch wenn es Ihre Logdateien füllt und Sie daran erinnert, dass Sie das Problem beheben müssen, wird PHP 8.2 Ihren Code nicht beschädigen. Das passiert in PHP 9.0, wenn die Warnung – und die Möglichkeit, automatisch dynamische Eigenschaften hinzuzufügen – aus PHP entfernt wird.
(Teilweise) Verwerfung der ${}-String-Interpolation
Dies ist eine weitere Verwerfung, von der ich anfangs dachte, dass sie eine große Sache sein würde. Eigentlich wird dies wahrscheinlich nicht viele Entwickler betreffen. Es gibt 4 Möglichkeiten, die “{$variableName}”-Syntax zu implementieren. Zwei davon sind sinnvoll, zwei – nicht. Die beiden, die keinen Sinn machen, werden abgeschafft.
echo “$meaningOfLife”;
Dies ist bei weitem die gebräuchlichste Version der String-Interpolation. Setzen Sie die Variable einfach in einem String mit doppelten Anführungszeichen. Wenn Sie dies auch jetzt tun, ist es in Ordnung, dies ist eine der beiden Möglichkeiten, die nicht abgeschafft werden.
echo “{$meaningOfLife}”;
echo “{$dogulasAdams->meaningOfLife()}”;
Ich habe das immer als “old-skool” betrachtet. Ja, das haben wir früher immer gemacht, aber ich habe es schon lange nicht mehr gemacht. Trotzdem funktioniert es, ist leicht zu verstehen. Dies ist die andere, die bleibt.
Dies ist auch die einzige Methode, mit der Sie Objekteigenschaften und -Methoden verwenden können. Wenn Sie also die String-Interpolation mit einem Objekt verwenden möchten, benötigen Sie diese Methode.
echo “${meaningOfLife}”;
Das hier wird verschwinden. Ja, es tut dasselbe wie die ersten beiden, aber es ist ein wenig verwirrender, weil der $ außerhalb der Klammern steht.
$fourtyTwo = 42;
$meaningOfLife = ‘fourtyTwo’;
echo “${meaningOfLife}”;
Schließlich gibt es noch die Möglichkeit, in der String-Interpolation “variable variables” zu verwenden. Das sind einfach zu viele Stufen der Umleitung. Im obigen Code kommen wir schließlich zu dem Punkt, an dem wir “echo 42” ausführen, aber wir nehmen den langen Weg.
Ab PHP 8.2 fügen die letzten beiden Strukturen eine DEPRECATION WARNUNG in Ihren Logdateien hinzu. In PHP 9.0 werden sie nicht mehr funktionieren und bringen Ihr Programm zum Stop. (oder sie werden einen Fehler auslösen, den Sie zwar abfangen, aber wahrscheinlich nicht mehr beheben können.)
Fazit
Das ist der erste PHP 8.2 Release Kandidat. Bitte testen Sie es nicht auf einer Produktions-Website. Wenn Sie es mit einer bestehenden Website testen möchten, fügen Sie eine neue Website zum Testen hinzu, klonen Sie Ihre Produktions-Website dort und testen Sie dann mit der Kopie. Wenn Sie fertig sind, können Sie sie einfach löschen.
Während Sie Ihre neue Testumgebung testen, überprüfen Sie Ihre Protokolldateien nach jedem Test. Vergewissern Sie sich, dass nichts fehlschlägt, und prüfen Sie, ob neue WARNUNGEN auftauchen.
Wenn PHP 8.2 mit PHP 8.0 und PHP 8.1 vergleichbar ist, erwarte ich nicht, dass der moderne PHP-Code damit Probleme haben wird. Glücklicherweise machen es die Elfen des Santa ElePHPants, die für SiteGround arbeiten, unglaublich einfach für Sie, Dinge zu testen und sicherzustellen, dass Ihre Website so schnell wie möglich mit PHP 8.2 läuft.
Wo wir gerade von der Leistung sprechen, PHP 8.2 wurde noch nicht richtig getestet, aber wir haben uns daran gewöhnt, dass jede PHP-Version ein wenig schneller ist als die vorherigen. Mit Änderungen am CSPRNG-System und anderen Dingen wie dem Entfernen der alten libmysql ist es eine sichere Wette, dass diese Version schneller sein wird als PHP 8.1.
Während Sie testen, klonen und die Ergebnisse beobachten, sollten Sie sich die Zeit nehmen, ein riesiges DANKESCHÖN an den Santa ElePHPanten und all die kleinen Elfen in Twitter zu posten, die diese Version möglich gemacht haben. Es gibt ein Gerücht, dass sie ein Auge auf twitter.com/php_net werfen.
Danke! Ihr Kommentar wird zur Moderation zurückgehalten und in Kürze veröffentlicht, wenn er einen Bezug zu diesem Blog-Artikel hat. Kommentare für Support-Anfragen oder Probleme werden nicht veröffentlicht, wenn Sie solche haben, melden Sie es bitte über
Starten Sie die Diskussion
Danke! Ihr Kommentar wird zur Moderation zurückgehalten und in Kürze veröffentlicht, wenn er einen Bezug zu diesem Blog-Artikel hat. Kommentare für Support-Anfragen oder Probleme werden nicht veröffentlicht, wenn Sie solche haben, melden Sie es bitte über