PHP 7.2 wurde offiziell am 30. November veröffentlicht und ist jetzt für alle Kinsta-Kunden verfügbar. Die Version hat neue Features, Funktionen und Verbesserungen, die uns erlauben einen besseren Code zu schreiben. In diesem Post werde ich einige der interessantesten Sprach-Features mit PHP 7.2. vorstellen.

Aktualisieren: PHP 7.3 ist jetzt für alle Kinsta-Clients verfügbar!

Du kannst die vollständige Liste der Änderungen auf der Seite Request For Comments sehen.

Kernverbesserungen

Argumenttyp-Deklarationen

Seit PHP 5 dürfen wir in der Deklaration einer Funktion den Argumenttyp angeben, der voraussichtlich übergeben wird. Wenn der angegebene Wert einen falschen Typ hat, gibt PHP einen Fehler aus.

Argumenttyp-Deklarationen (auch bekannt als Type-Hints) geben den Typ einer Variablen an, die erwartungsgemäß an eine Funktion oder Klassenmethode übergeben wird.

Hier ist ein Beispiel:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $myclass){
	return $myclass->var;
}

echo test($myclass);

In diesem Code erwartet die Funktion Test eine Instanz von MyClass. Ein falscher Datentyp würde zu dem folgenden schwerwiegenden Fehler führen:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8

Seit PHP 7.2 können Type-Hints mit dem Objekt-Datentyp verwendet werden, und diese Verbesserung ermöglicht es, ein generisches Objekt als Argument einer Funktion oder Methode zu deklarieren. Hier ist ein Beispiel:
class MyClass

{
public $var = '';

}

class FirstChild extends MyClass {

public $var = 'My name is Jim';

}

class SecondChild extends MyClass {

public $var = 'My name is John';

}

$firstchild = new FirstChild;

$secondchild = new SecondChild;

function test(object $arg) {

return $arg->var;
}

echo test($firstchild);

echo test($secondchild);

In diesem Beispiel haben wir die Testfunktion zweimal aufgerufen und bei jedem Aufruf ein anderes Objekt übergeben. Dies war in früheren PHP-Versionen nicht möglich.

Testen von Type-Hints mit PHP 7.0 und PHP 7.2 in Docker

Testen von Type-Hints mit PHP 7.0 und PHP 7.2 in Docker

Objekt-Rückgabetyp-Deklarationen

Wenn Argumenttyp-Deklarationen den erwarteten Typ für die Argumente einer Funktion angeben, geben Rückgabetyp-Deklarationen den erwarteten Typ des zurückgegebenen Werts an.

Rückgabetyp-Deklarationen geben den Typ einer Variablen an, die von einer Funktion zurückgegeben werden soll.

Ab PHP 7.2 können wir Rückgabetyp-Deklarationen für den Datentyp Objekt verwenden. Hier ist ein Beispiel:

class MyClass {
	public $var = 'Hello World';
}

$myclass = new MyClass;

function test(MyClass $arg) : object {
	return $arg;
}

echo test($myclass)->var;

Frühere PHP-Versionen werfen den folgenden schwerwiegenden Fehler auf:

Schwerwiegender Fehler: Nicht abgefangener TypeError: Der Rückgabewert von Test () muss eine Instanz von Objekt sein, die Instanz von MyClass, die in /app/index.php:10 zurückgegeben wird

Natürlich spiegelt dieser Code in PHP 7.2 ‘Hello World’ wider.

Parametertyp-Erweiterung

PHP erlaubt derzeit keine Varianz von Parametertypen zwischen untergeordneten Klassen und ihren Elternklassen oder Schnittstellen. Was bedeutet das?
Betrachte den folgenden Code:

<?php
class MyClass {
public function myFunction(array $myarray) { /* ... */ }
}

Hier haben wir den Parametertyp in der Unterklasse weggelassen. In PHP 7.0 erzeugt dieser Code die folgende Warnung:

Warnung: Die Deklaration von MyChildClass :: myFunction ($ myarray) sollte mit MyClass :: myFunction (Array $ myarray) in% s in Zeile 8 kompatibel sein

Seit PHP 7.2 dürfen wir einen Typ in einer Unterklasse weglassen, ohne irgendeinen Code zu brechen. Dieser Vorschlag ermöglicht es uns, Klassen zu aktualisieren, um Type-Hints in Bibliotheken zu verwenden, ohne dass alle Unterklassen aktualisiert werden müssen.

Nachgestellte Kommas in Listen-Syntax

Ein nachgestelltes Komma nach dem letzten Element in Arrays ist eine gültige Syntax in PHP, und manchmal wird es empfohlen, neue Elemente einfach anzuhängen und Parsing-Fehler aufgrund eines fehlenden Kommas zu vermeiden. Seit PHP 7.2 dürfen wir nachgestellte Kommas verwenden in gruppierten Namenslücken.

Siehe Nachgestellte Kommas in der Listen-Syntax für eine ausführlichere Ansicht auf diese RFC und einige Beispiele für Code.

Sicherheitsverbesserungen

Argon2 im Passwort-Hash

Argon2 ist ein leistungsstarker Hashalgorithmus, der als Gewinner des 2015 Password Hashing Competition ausgewählt wurde, und PHP 7.2 wird es uns als sichere Alternative zumBcryptAlgorithmus bieten.
Die neue PHP-Version führt die PASSWORD_ARGON2I -Konstante ein, die nun inpassword_* -Funktionen verwendet werden kann:
password_hash('password', PASSWORD_ARGON2I);

Im Gegensatz zu Bcrypt, das nur einen Kostenfaktor benötigt, benötigt Argon2 drei Kostenfaktoren, die sich wie folgt unterscheiden:

  • Speicherkosten, welche die Anzahl der KiB definieren, die beim Hashen verbraucht werden sollen (Standardwerte sind 1 << 10 oder 1024 KiB oder 1 MiB)
  • Zeitkosten, welche die Anzahl der Iterationen des Hashalgorithmus definieren (standardmäßig 2)
  • Ein Parallelitätsfaktor, der die Anzahl der parallelen Threads festlegt, die beim Hashing verwendet werden (standardmäßig 2)

Drei neue Konstanten definieren Standardkostenfaktoren:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Hier ist ein Beispiel:

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2];
password_hash('password', PASSWORD_ARGON2I, $options);

See Argon2 Password Hash for more information.

Libsodium als Teil von PHP Core

Ab Version 7.2 umfasst PHP die Natrium-Bibliothek im Kern. Libsodium ist eine plattformübergreifende und sprachenübergreifende Bibliothek für Verschlüsselung, Entschlüsselung, Signaturen, Passwort-Hashing und mehr.
Die Bibliothek war zuvor über PECL® verfügbar.
Für eine dokumentierte Liste von Libnodium-Funktionen, siehe die Bibliothek Quick Start Guide.
Siehe auch PHP 7.2: Die erste Programmiersprache zum Hinzufügen moderner Kryptographie zu ihrer Standardbibliothek.

Haben Sie mit Ausfallzeiten und WordPress-Problemen zu kämpfen? Kinsta ist die Hosting-Lösung, die Ihnen Zeit spart! Sieh dir unsere Features an

Abschreibungen

Hier ist eine Liste von PHP 7.2veralteten Funktionen und Features, die nicht später als PHP 8.0 entfernt werden:

Die Funktion __autoload wurde in PHP 5.1 durch spl_autoload_register pilierung auftritt.

Die Variable $php_errormsg wird im lokalen Bereich erstellt, wenn ein non-fatal Error ausgelöst wird. Seit PHP 7.2 sollten stattdessenerror_get_last und error_clear_last verwendet werden.

create_function() erlaubt die Erstellung einer Funktion mit einem generierten Funktionsnamen, einer Liste von Argumenten und einem Body-Code, die als Argumente zur Verfügung gestellt werden. Aufgrund von Sicherheitsproblemen und schlechter Performance wurde es als veraltet markiert und die Verwendung von Anlagen wird stattdessen empfohlen.

Die Einstellung mbstring.func_overload ini, die auf einen Wert ungleich Null gesetzt wurde, wurde als veraltet markiert.

(unset) cast ist ein Ausdruck, der immer null zurückgibt und als nutzlos gilt.

parse_str() parst eine Abfragezeichenfolge in ein Array, wenn das zweite Argument angegeben ist, oder in die lokale Symboltabelle, wenn sie nicht verwendet wird. Da die dynamischen Variablen im Funktionsumfang aus Sicherheitsgründen discouraged sind, wird durch die Verwendung von parse_str () ohne das zweite Argument eine Verwarnungsbenachrichtigung ausgelöst.

gmp_random() gilt als plattformabhängig und wird nicht weiter unterstützt. Verwendegmp_random_bits() und gmp_random_rage() stattdessen.

each() wird verwendet, um über ein Array ähnlich wie foreach() zu iterieren, aberforeach() ist aus verschiedenen Gründen vorzuziehen, einschließlich 10-mal schneller. Jetzt wird eine Abschwächung beim ersten Aufruf in einer Schleife aufgeworfen.

Die Funktionassert() prüft die gegebene Assertion und ergreift geeignete Aktionen, wenn das Resultat FALSE ist. Die Verwendung von assert () mit Zeichenfolgenargument ist jetzt veraltet, da es eine RCE-Schwachstelle öffnet. Die Option zend.assertion ini kann verwendet werden, um die Auswertung von Assertionsausdrücken zu verhindern.

$errcontextist ein Array, das die lokalen Variablen enthält, die zu dem Zeitpunkt vorhanden sind, an dem ein Fehler generiert wird. Es wird als letztes Argument für Fehlerbehandlungsroutinen übergeben, die mit der Funktion set_error_handler() gesetzt wurden.

Was bedeutet PHP 7.2 für WordPress User?

Laut der offiziellen WordPress Stats-Seite haben nur 19,8% der WordPress-User ein Upgrade auf PHP 7 durchgeführt. Und nur 5% verwendenPHP 7.1. Du kannst sehen, dass eine große Mehrheit der User, über 40%, immer noch auf PHP 5.6 läuft. Noch erschreckender ist, dass über 39% der User nicht unterstützte PHP-Versionen verwenden. Im Dezember 2016 steigerte WordPress.org seine offizielle Empfehlung für User von PHP 5.6 auf PHP 7 oder höher

WordPress PHP 7.1 stats

WordPress PHP 7.1 stats

Die obigen Zahlen sind aus Sicht der Performance besonders entmutigend, da es zeigt, dass PHP 7 deutlich schneller ist. Hier sind ein paar Statistiken:

  • Offizielle PHP Benchmarks zeigen, dass PHP 7 im Vergleich zu PHP 5.6 doppelt so viele Anfragen pro Sekunde ausführen kann, bei fast der Hälfte der Latenzzeit.
  • Christian Vigh hat auch einen PHP-Performance-Vergleich veröffentlicht, in dem er herausfand, dass PHP 5.2 um 400% langsamer war als PHP 7.

Wir führen unsere eigenen Performance-Benchmarks aus im Jahr 2018 mit PHP 5.6 vs PHP 7 vs HHVM. Und ähnlich wie bei den obigen Benchmarks haben wir gesehen, dass PHP 7.2 fast dreimal so viele Transaktionen (Anfragen) pro Sekunde ausführen kann wie PHP 5.

WordPress benchmarks

WordPress benchmarks

  • WordPress 4.9.4 PHP 5.6 Benchmark Resultate: 49,18 req/sec
  • WordPress 4.9.4 PHP 7.0 Benchmark Resultate: 133,55 req/sec
  • WordPress 4.9.4 PHP 7.1 Benchmark Resultate: 134,24 req/sec
  • WordPress 4.9.4 PHP 7.2 Benchmark Resultate: 148,80 req/sec🏆
  • WordPress 4.9.4 HHVM Benchmark Resultate: 144,76 req/sec

Viele Updates werden nur langsam ausgeführt, da die Plug-ins und Themes von Drittanbietern alle neu getestet werden müssen, um sicherzustellen, dass sie ordnungsgemäß funktionieren. Aber oft kommt es darauf an, dass sie es noch nicht getan haben. Nicht sicher, welche PHP-Version du verwendest? Eine der einfachsten Möglichkeiten zum Überprüfen ist ein Tool wie Pingdom oder Google Chrome Devtools. Der erste HTTP-Request-Header zeigt dir normalerweise die Version an.

Überprüfe Version von PHP

Überprüfe Version von PHP

Dies beruht darauf, dass der Host den X-Powered-By-Header-Wert nicht ändert. Wenn dies der Fall ist, wird deine PHP-Version möglicherweise nicht angezeigt. In diesem Fall musst du eine Datei per FTP hochladen. Oder du kannst immer deinen Host zur Unterstützung kontaktieren und fragen.

Aktualisieren auf PHP 7.2

PHP 7.2 ist noch nicht ganz raus, aber sobald es soweit ist, kannst du mit dem Testen beginnen. Du kannst deine WordPress-Site lokal testen oder deine Skripts in einer Umgebung wie Docker überprüfen, mit der du verschiedene Versionen von PHP über die Befehlszeile testen kannst.

Oder du kannst eine Staging-Umgebung verwenden, da diese eher einer Live-Produktionsstätte ähnelt. Kinsta hat am 4. Dezember PHP 7.2 für alle Kunden verfügbar gemacht. Du kannst mit nur einem Klick eine Staging-Umgebung erstellen.

Test PHP 7.2 in Staging-Umgebung

Test PHP 7.2 in Staging-Umgebung

Mit nur einem Klick änderst du die PHP-Engine für die Staging-Site unter „Tools“ und du kannst mit dem Testen beginnen, um die Kompatibilität deiner Plugins und Themes von Drittanbietern sicherzustellen. Sobald du sicher bist, dass alles funktioniert, kannst du entweder deine Produktions-Site auf PHP 7.2 umstellen oder deine Staging-Site zum Leben bringen.

Wechsel zu PHP 7.2

Wechsel zu PHP 7.2

Fazit

Bist du bereit zu PHP 7.2 zu wechseln? Hoffentlich hast du zumindest den Übergang zu PHP 7 geschafft. Falls nicht, ist es eine gute Zeit, um zu testen. Aktualisiere deine Skripte, überprüfe deinen Code und teile uns deine ersten Eindrücke von PHP 7.2 mit.

Empfohlene Lektüre: Ist PHP tot?