
Syntax
- Erweichen Sie die Heredoc- und Nowdoc-Syntaxanforderungen
- Unterstützung für nachgestellte Kommas in Funktions- und Methodenaufrufen
- Links in
list()
Veraltete Funktionen (veraltet)
image2wbmp()
Funktion image2wbmp()
ist veraltet- Die Flags
FILTER_FLAG_SCHEME_REQUIRED
und FILTER_FLAG_HOST_REQUIRED
bei Verwendung von FILTER_VALIDATE_URL
FILTER_FLAG_HOST_REQUIRED
- Registrieren Sie unabhängige Konstanten, die veraltet sind
Neue Funktionen
- Optionales
json_encode
Ausnahmen für Fehler in den json_decode
json_encode
und json_decode
- Hinzufügen der Funktion
is_countable()
- Hinzufügen der Funktionen
array_key_first()
und array_key_last()
Änderungen
- Migration von PCRE zu PCRE2
Erweichen Sie die Heredoc- und Nowdoc-Syntaxanforderungen
Heredoc und Nowdoc forderten, die schließende Kennung zuerst in eine neue Zeile zu setzen.
Ein Beispiel:
$foo = <<<IDENTIFIER the crazy dog jumps over the lazy fox "foo" bar; IDENTIFIER
Hier muss der schließende IDENTIFIER
das erste Zeichen in der neuen Zeile sein, damit dies funktioniert. Außerdem sollten nach dem schließenden Bezeichner keine weiteren Zeichen stehen (außer ;
was optional ist).
Der RFC für PHP 7.3 schlägt vor, diese Anforderungen zu entfernen, um die Lesbarkeit des Codes zu verbessern. Zunächst, um Einrückungen hinzuzufügen, wenn heredoc/nowdoc
Bezeichner verwendet werden.
Vollständige Liste der Änderungen an der heredoc/nowdoc
Syntax:
- Die schließende Kennung muss nicht das erste Zeichen in der Zeichenfolge sein.
- Die schließende Kennung wird mit Leerzeichen oder Tabulatoren eingerückt.
- Einrückungen (Leerzeichen oder Tabulatoren) sollten nicht gemischt werden. Wenn Sie dies tun, wird der
Parse error: Invalid indentation - tabs and spaces cannot be mixed in .. on line ..
- Die genaue Anzahl der Leerzeichen / Tabulatoren, die vor dem schließenden Bezeichner verwendet werden, wird aus jeder Zeile des
heredoc/nowdoc
Ausdrucks entfernt. - Wenn die Anzahl der Einrückungszeichen, die vor dem schließenden Bezeichner verwendet werden, größer ist als in einer der Zeilen des Ausdrucks, wird der
Parse error: Invalid body indentation level (expecting an indentation level of at least ..) in .. on line ..
- Mehrere Ausdrücke nach dem schließenden Bezeichner funktionieren fehlerfrei
Hier ist ein Ausschnitt, der neue Funktionen nutzt, ohne neue Regeln zu brechen:
$foo = ['foo', 'bar', <<<EOT baz - hello world! -- ahoy EOT, 'qux', 'quux' ]; var_dump($foo);
Die Ausgabe wird sein:
array(5) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(29) "baz - hello world! -- ahoy" [3]=> string(3) "qux" [4]=> string(4) "quux" } `
Beachten Sie, dass der Einzug, der in der Deklaration mit heredoc
, in der Ausgabe von var_dump()
nicht angezeigt wird, und wir haben die Elemente des Arrays nach dem EOT
Bezeichner weiter var_dump()
.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Bis Sie einen Satz identischer heredox/nowdoc
Zeichenkennungen als Zeilenanfang verwenden, befinden Sie sich auf einem Pferd.
$foo = <<<HELLO HELLO_WORLD <-- HELLOWORLD <-- HELLO WORLD <-- HELLO;
Wenn Sie eine heredoc/nowdoc
Syntax haben, die der oben beschriebenen ähnlich ist, heredoc/nowdoc
ich fest, dass PHP mit PHP 7.3 das erste HELLO
Literal akzeptiert und einen Fehler in die nächste Zeile wirft. In früheren Versionen wurde HELLO WORLD
nicht als abschließende Kennung für Heredoc angesehen. Vielen Dank an / u / ImSuperObjective2 mit reddit für den Hinweis
Unterstützung für nachgestellte Kommas in Funktions- und Methodenaufrufen
Dies ist eine einfache Änderung, die die Verwendung von nachgestellten Kommas in Funktionsaufrufen und Methoden ermöglicht. Die Erklärung bleibt davon unberührt.
Beispielsweise wird die folgende Syntax möglich:
In Versionen vor PHP-7.3 löst das obige Snippet einen PHP Parse error: syntax error, unexpected ')' in .. on line ..
Sie können nicht mehr als ein Komma am Ende verwenden oder Kommas verwenden, um Argumente zu überspringen. Dies ist hauptsächlich eine Änderung für eine Funktion mit variablen Parametern. Auch bei neuen Änderungen sieht die Array-Syntax konsistenter aus.
Beachten Sie, dass Sie diese Funktion nicht in Funktions- / Methodendeklarationen verwenden können. das ist nicht richtig:
function foo($bar, $baz, ) {
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Nichts. Bestehender Code funktioniert weiterhin. Wenn Sie Funktionsaufrufe haben, die variable Parameter akzeptieren, fügen Sie diesen Stellen zur Vereinfachung nachfolgende Kommas hinzu. Aber sie überall zu benutzen ist offensichtlich zu viel.
Links in list()
Die Funktion list()
ist nützlich, um Variablen aus einem Array schnell Werte zuzuweisen. Vor PHP 7.3 war es nicht möglich, eine Variable als Referenz anzugeben. Vor PHP 7.3 führte das folgende Snippet zu einem schwerwiegenden Fehler:
$arr = ['apple', 'orange']; list($a, &$b) = $arr; $b = 'banana'; echo $arr[1];
Es ist unmöglich, auf non-referencable
Variablen zu verweisen: list($a, &$b) = [12, 14];
gibt einen Fatal error: Cannot assign reference to non referencable value in .. on line ..
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Nein. Anstatt list()
zum Auffüllen mehrerer Variablen zu verwenden, würde ich vorschlagen, dass Sie Wertobjekte verwenden, um die Dinge zu vereinfachen. Sie werden weiterhin als Referenz übergeben, machen Ihren Code jedoch viel sauberer.
image2wbmp()
Funktion image2wbmp()
ist veraltet
image2wbmp()
Funktion image2wbmp()
aus der GD-Erweiterung wird verwendet, um Bilder im WBMP-Format (Wireless Bitmap) auszugeben. In PHP 7.3 ist es zugunsten der Funktion imagewbmp()
veraltet.
Wenn Sie image2wbmp()
, ersetzen Sie einfach den Funktionsnamen durch imagewbmp
und alles wird gut! Über 5,500 image2wbmp()
auf Github gegenüber über 39,300 imagewbmp()
. Es sieht so aus, als würde das PHP-Entwicklungsteam weniger genutzte Funktionen entfernen, um die Auswirkungen zu minimieren.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Wenn Sie die Funktion image2wbmp()
verwenden, ersetzen Sie den Aufruf durch imagewbmp
. Nutzen Sie die Automatisierung, die dies für Sie ändern kann.
Die Flags FILTER_FLAG_SCHEME_REQUIRED
und FILTER_FLAG_HOST_REQUIRED
bei Verwendung von FILTER_VALIDATE_URL
FILTER_FLAG_HOST_REQUIRED
Dies ist eine Vorwärtsbewegung. Wenn Sie filter_var($var, FILTER_VALIDATE_URL)
, können zwei zusätzliche Flags gesetzt werden, um eine strikte URL-Überprüfung sicherzustellen: FILTER_FLAG_SCHEME_REQUIRED
und FILTER_FLAG_HOST_REQUIRED
.
Ab PHP 5.2.1 werden beide Flags implizit angewendet, unabhängig davon, ob sie gesetzt sind oder nicht.
Wenn Ihr Code diese Flags verwendet, löschen Sie sie einfach und es wird in Ordnung sein. Derzeit werden über 5.000 Github-Suchergebnisse verwendet.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Da diese beiden Flags veraltet sind, wird eine Benachrichtigung wie folgt angezeigt:
Deprecated: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated in ...
Alles was Sie tun müssen, ist nur die beiden Flags als zu entfernen Sie sind FILTER_VALIDATE_URL
impliziert, wenn FILTER_VALIDATE_URL
.
Registrieren Sie unabhängige Konstanten, die veraltet sind
Mit der Funktion define()
können Sie eine Konstante im Modus ohne Berücksichtigung der Groß- und Kleinschreibung deklarieren. Sie müssen eine Konstante mit Groß- und Kleinschreibung explizit deklarieren, indem Sie den dritten Parameter der Funktion true
. Dies ist nicht das Standardverhalten und entspricht wahrscheinlich nicht der Fähigkeit, Konstanten über das Schlüsselwort const
deklarieren.
define('Foo', 'Bar', true);
Der obige Code löst eine Veralterungsbenachrichtigung aus: Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...
Wenn Sie versuchen, auf Konstanten zuzugreifen, die im FOO
Modus ( Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
) deklariert wurden, wird eine nützliche Warnung Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
Konstanten, bei denen die Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
FOO
wird, Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Sie müssen zum Basiscode gehen, in dem registerunabhängige Konstanten deklariert und anschließend korrigiert werden. Es ist äußerst unwahrscheinlich, dass es Probleme damit gibt, da es ziemlich mühsam ist, alle Anwendungsfälle zu erfassen, aber dadurch wird der Code klarer.
Ich habe keine Beispiele für diese Verwendung auf Github gefunden, aber zumindest Drupal und WordPress (zwei ziemlich alte und ausgereifte PHP-Projekte) haben Konstanten, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.
Optionales json_encode
Ausnahmen für Fehler in den json_decode
json_encode
und json_decode
Einer meiner Favoriten. Während all dieser Jahre json_encode()
und json_decode()
über Fehler in PHP-Variablen oder json-Zeichenfolgen, die zu Code führten, der mit Tags versehen war. Dieser Fall war sogar in der berühmten Kritik an PHP: Ein Fraktal von schlechtem Design .
json_decode
gibt null für ungültige Eingaben zurück, während null ein absolut wahres Objekt für dekodiertes JSON ist. Diese Funktion ist völlig unzuverlässig, es sei denn, Sie rufen json_last_error
jeder Verwendung json_last_error
.
Es dauerte 6 Jahre nach diesem Blog-Beitrag und wir hatten die Gelegenheit, einen Fehler über JSON-Fehler zu erhalten:
try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage();
Die neue \JsonException
ist ein Nachkomme von \Exception
, sowie die Konstante JsonException
und JsonException
selbst befinden sich im globalen Namespace.
Ich empfehle Ihnen dringend, diese Funktion zu verwenden. Es gibt Bibliotheken von Drittanbietern wie daverandom / exception-json , die ähnliche Funktionen für PHP-Versionen 7.2 und niedriger implementieren. Mit dem Erscheinen dieser Funktion im PHP-Kern können Sie dieses Paket und jede json_last_error()
hässlichen Vorlagencode mit dem Aufruf json_last_error()
an jedem Ort entfernen, an dem Sie mit json arbeiten.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Nichts, wenn Sie keine eigene Ausnahme und / oder Konstante mit demselben Namen verwenden.
Hinzufügen der Funktion is_countable()
PHP 7.2 hat viele veraltete und fehlerhafte Funktionen. Wenn Sie in PHP 7.2 sind. Rufen Sie count()
mit einer nicht countable
Variablen auf, dann zeigt PHP eine Warnung dazu an. Bei allgemeinen Änderungen wurde vorgeschlagen, die resultierende Variable auf countable
zu überprüfen, bevor sie in count()
.
countable
-variable ist ein Array oder Objekt, das die Schnittstelle \Countable
implementiert. Da während der Überprüfung viel Boilerplate-Code verwendet wird, hat PHP 7.3 eine neue Funktion is_countable()
, die die Variable auf ... nun ... die Möglichkeit der Verwendung von count()
überprüft.
Ich habe eine Polydatei für is__countable () geschrieben, wenn Sie diese Funktion jetzt verwenden möchten.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Bis die eigene Funktion is_countable()
, gibt es keine Probleme.
Hinzufügen der Funktionen array_key_first()
und array_key_last()
Es gibt 75 verschiedene Funktionen in PHP für die Arbeit mit Arrays, aber bisher gab es keine einfache Möglichkeit, den ersten und den letzten Schlüssel eines Arrays array_keys()
ohne den Array-Zeiger zu ändern oder alle Schlüssel array_keys()
über array_keys()
) und dann den ersten / letzten Wert array_keys()
.
Es wurden zwei neue Funktionen array_key_first()
, array_key_first()
und array_key_last()
, mit denen Sie dies tun können.
Der RFC schlug außerdem vor, array_value_first()
und array_value_last()
, aber dieser Teil hat die Abstimmung nicht bestanden.
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Wenn Sie Ihre eigenen Funktionen array_key_first()
und array_key_last()
nicht deklariert haben, ist dies kein Problem.
Migration von PCRE zu PCRE2
PHP verwendet Perl-kompatible reguläre Ausdrücke oder kurz PCRE in der Bibliothek, um mit regulären Ausdrücken zu arbeiten. Seit PHP 7.2 wird die 8.x-Version der PCRE Legacy Library verwendet, und in PHP 7.3 wird PCRE2 bereits verwendet. Bitte beachten Sie, dass PCRE2 als neue Bibliothek betrachtet wird, obwohl es weitgehend mit PCRE (8.x) kompatibel ist.
Die neue Bibliothek ist aggressiver bei der Mustervalidierung und kann zu Fehlern im vorhandenen Code führen. Das folgende Snippet ist mit PHP 7.3 ungültig:
preg_match('/[\w-.]+/', '');
PHP gibt eine Warnung aus. Warning: preg_match(): Compilation failed: invalid range in character class at offset 3
.
Das Problem mit dem Muster: Damit dies funktioniert, muss der Bindestrich bis zum Ende verschoben oder maskiert werden.
preg_match('/[\w\-.]+/', '');
Der obige Code funktioniert nicht nur mit PHP 7.3, sondern auch mit älteren Versionen. Im neuen Muster wird der Bindestrich in \-
. Dies ist das häufigste Problem, das bei der Lösung von Kompatibilitätsproblemen auftreten kann.
Dies ist eine ziemlich kleine Änderung, aber es besteht die Möglichkeit, dass alles schief geht. Die Fehlermeldung gibt die genaue Position des Zeichens im regulären Ausdruck an. Überprüfen Sie Ihren Code sorgfältig. Überprüfen Sie Ihre regulären Ausdrücke auf Kompatibilität mit der PCRE2-Syntax über Regex Buddy
oder eine andere ähnliche Software. Weitere Informationen finden Sie in der Beschreibung der PCRE2-Syntax und der älteren PCRE-Syntax .
RFC , Diskussion auf Externals.io , Implementierung
Auswirkungen auf die Abwärtskompatibilität
Da PCRE2 in Bezug auf Vorlagen wählerischer und strenger ist, preg_match()
einige Ihrer preg_match()
und ähnlichen Aufrufe möglicherweise nicht. Das Update reicht von der einfachen Aktualisierung der Vorlage (z. B. das Entkommen von Bindestrichen) bis zum Umschreiben von Vorlagen. Stellen Sie sicher, dass alle Ihre Tests bestanden sind.