Dieser Artikel ist übersetzt, Originaladresse: https://stitcher.io/blog/php-81-new-in-initializers
PHP 8.1: Initialisierer (neu in Initialisierern)
PHP 8.1 hat einen hinzugefügt Es mag wie ein kleines Detail erscheinen, aber ich denke, dass es für viele Menschen eine große tägliche Auswirkung haben wird. Worum geht es also in diesem „Was ist neu im Initializer RFC“? Schauen wir uns ein Beispiel an; wir haben alle Code wie diesen geschrieben:
class MyStateMachine { public function __construct( private ?State $state = null, ) { $this->state ??= new InitialState(); } }
In diesem Beispiel einer Zustandsmaschine möchten wir unsere Klasse auf zwei Arten strukturieren: mit und ohne Anfangszustand. Wenn wir es ohne Anfangszustand erstellen, möchten wir einen Standardzustand festlegen. PHP unterstützt zwar das Setzen von Anfangswerten direkt in der Parameterliste, allerdings nur für primitive Typen. Wenn unsere Zustandsmaschine beispielsweise intern Zeichenfolgen anstelle von Objekten verwendet, können wir ihren Konstruktor wie folgt schreiben:
class MyStateMachine { public function __construct( private string $state = 'initial', ) { } }
In PHP 8.1 können wir also auch dieselbe „Standardwert“-Syntax für Objekte verwenden. Mit anderen Worten: Sie können neue Standardparameter verwenden (dies ist ein Beispiel für einen „Initialisierer“):
class MyStateMachine { public function __construct( private State $state = new InitialState(), ) { } }
„Initialisatoren“ sind mehr als nur Parameterstandards. Hier ist eine einfache Erklärung des RFC:
Der RFC schlägt neue Ausdrücke vor sind in Parameterstandards, Eigenschaftsparametern, statischen Variableninitialisierern und globalen Konstanteninitialisierern zulässig
Sie haben richtig gelesen: Eigenschaften sind auch in dieser Liste! Stellen Sie sich eine einfache Validierungsbibliothek vor, die Attribute verwendet, um Eingaben in Eigenschaften zu validieren. Vielleicht sollte es in der Lage sein, Array-Elemente wie dieses zu validieren:
class CreateEmailsRequest extends FormRequestData { #[ValidArray( email: [new Required, new ValidEmail], name: [new Required, new ValidString], )] public array $people; }
Vor PHP 8.1 konnten Sie keinen Code wie diesen schreiben, da Sie aufgrund der Art und Weise, wie sie ausgewertet wurden, keine neuen Attribute verwenden durften, aber jetzt du kannst!
Werfen wir einen Blick auf einige wichtige Details, die es wert sind, erwähnt zu werden.
Möchten Sie mehr über PHP 8.1 erfahren? Es gibt einen Pfad zu PHP 8.1. In den nächsten 10 Tagen erhalten Sie täglich eine E-Mail über eine neue und bestehende Funktion von PHP 8.1. Anschließend werden Sie automatisch abgemeldet, sodass Sie keinen Spam oder Folge-E-Mails erhalten. Jetzt abonnieren!
#Nur bei Bedarf erstellen
Diese „neuen Werte“ werden nur dann erstellt, wenn sie tatsächlich benötigt werden. Das bedeutet, dass InitialState in unserem ersten Beispiel nur dann ein neues Objekt erstellt, wenn keine Argumente angegeben werden:
class MyStateMachine { public function __construct( private State $state = new InitialState(), ) { } } new MyStateMachine(new DraftState()); // No InitialState is created new MyStateMachine(); // But now it is
Im Fall von Eigenschaften wird das Objekt beispielsweise nur erstellt, wenn newInstance für eine reflektierende Eigenschaft aufgerufen wird.
#Nicht in einem Klassenattribut
Sie sollten auch wissen, dass new nicht als Standardwert in einem Klassenattribut verwendet werden kann. Die Unterstützung dieser Funktion führt zu einer Reihe unvorhergesehener Nebenwirkungen, beispielsweise beim Serialisieren und Deserialisieren von Objekten.
class MyStateMachine { private State $state = new InitialState(); }
Glücklicherweise haben wir gehisste Eigenschaften, die Standardwerte zulassen, da PHP die Property-Hoist-Syntax umwandelt, um den Standardwert in den Konstruktorparametern beizubehalten, nicht jedoch in den tatsächlichen Eigenschaften.
Hier ist die übersetzte Version:
class MyStateMachine { private State $state; public function __construct( State $state = new InitialState(), ) { $this->state = $state; } }
#FINED INPUTS
Sie haben es vielleicht erraten, aber wenn Sie ein neues Objekt in einem Initialisierer erstellen, können Sie nur eine begrenzte Anzahl von Eingaben übergeben. Sie können beispielsweise keine Variablen, Spread-Operatoren, anonymen Klassen usw. verwenden. Dennoch ist es eine sehr willkommene Ergänzung!
Das obige ist der detaillierte Inhalt vonNeue Funktionen von PHP8.1 erklärt Initialisierer Initialisierer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!