Vor gar nicht allzu langer Zeit, am 30. November 2017, wurde die zweite große Iteration von PHP 7 vorgestellt - PHP 7.2. Bei PHP handelt es sich um eine serverseitige Skriptsprache, die hauptsächlich in der Webentwicklung zur Erstellung von dynamischen Websites bzw. Webanwendungen zum Einsatz kommt und mit Abstand die am meisten genutzte serverseitige Programmiersprache darstellt. Heute schauen wir uns mal die Neuerungen an, die PHP 7.2 mit sich bringt.

Das sind die wesentlichen Neuerungen

Ich beginne erstmal mit einem kurzen Überblick über die Neuerungen von PHP 7.2. So markiert der Release das zweite Feature-Update der PHP-7-Serie und beinhaltet dementsprechend einige neue Features. Auch wurden einige Verbesserungen vorgenommen, Fehler behoben und sogar ein paar Dinge als “deprecated” abgestempelt, was bedeutet, dass diese Funktionen bald aus PHP entfernt werden.

Zu den wichtigsten Neuerungen gehört Folgendes:

Nun werden wir uns die einzelnen Änderungen einzeln im Detail anschauen. Wir beginnen mit dem Object Typehint, der wohl wichtigsten Änderung neben dem neuen Hash-Algorithmus Argon2.

Wer an einer vollständigen Liste mit allen Änderungen interessiert ist, kann dies im Changelog von PHP 7.2 finden.

Object Typehint

Mit PHP 7 wurden Typehints für die sogenannten scalar types eingeführt, wodurch man bei Parametern sowie Rückgabewerten von Funktionen einen gewissen Typ erzwingen konnte.

Eine Funktion, die beispielsweise zwei Integer erwartet, diese addiert und anschließend zurückgibt, kann somit folgendermaßen seit PHP 7 implementiert werden:

function add(int $number1, int $number2) : int {
  return $number1 + $number2;
}

Beachtet man dies nicht und übergibt als erstes Argument z.B. einen String wie “test”, wird ein Fatal error: Uncaught TypeError geschmissen, welcher besagt, dass nicht der erwartete Typ als Argument übergeben wurde. In unserem Fall wurde ein String statt einem Integer übergeben.

Neben den einfachen Datentypen wie Strings und Integern war dies in PHP 7 aber auch schon mit Klassen möglich. So können wir einer Funktion vorschreiben, ein Objekt bzw. eine Instanz von einer bestimmten Klasse zu erwarten. Folgender Code würde einfach “Hello World” ausgeben:

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

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

echo foo(new MyClass);

Würden wir hingehen und wieder ein Argument mit einem falschen Typen übergeben, also z.B. eine Instanz einer anderen Klasse, würde uns wieder eine Fehlermeldung ausgegeben werden.

PHP 7.2 ermöglicht uns durch die Einführung des object Datentyps als Typehint nun, dass es vollkommen egal ist, welcher Klasse das übergebene Objekt angehört. Dies bedeutet, dass wir nun Typehints verwenden können, ohne eine bestimmte Klasse vorauszusetzen:

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

class MyOtherClass {
  public $var = 'Hello World, how are you?';
}

function foo(object $myclass) {
  return $myclass->var;
}

echo foo(new MyClass);
echo foo(new MyOtherClass);

In unserem Beispiel haben wir zwei verschiedene Klassen, die unterschiedliche Strings beinhalten, und es daher unten zwei verschiedene Ausgaben gibt. Der wesentliche Punkt dabei: Wir können dank des object Typehints beide Instanzen der verschiedenen Klassen übergeben.

Genau das Gleiche funktioniert natürlich auch mit Rückgabewerten. Als Beispiel nehmen wir eine kleine Funktion, die zufällig ein Objekt auswählt und zurückgibt, welches ihr zuvor in einem Array zusammen mit anderen Objekten übergeben wurde:

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

class MyOtherClass {
  public $var = 'Hello World, how are you?';
}

function randomObject(array $objects) : object {
  shuffle($objects);
  return $objects[0];
}

var_dump(randomObject([
  new MyClass,
  new MyOtherClass
]));

Vor PHP 7.2 hätten wir auf den Typehint des Rückgabewertes verzichten müssen.

Neuer Hash-Algorithmus Argon2

Mit dem neuen Hash-Algorithmus Argon2 erhält PHP 7.2 auch eine wesentliche Verbesserung in Sachen Sicherheit. So haben wir nun eine moderne und sichere Alternative zum Bcrypt-Algorithmus, welcher aktuell noch der Standard-Hashing-Algorithmus für die password_hash()-Funktion ist.

Argon2 wurde nach dem “Password Hashing Competition” Wettbewerb, der sich über die Jahre 2013 bis 2015 erstreckte, als neuer Algorithmus für das Hashen von Passwörtern empfohlen. Das Besondere an diesem ist, dass er nun nicht mehr nur einen einzigen Kostenfaktor berücksichtigt, wie es bei Bcrypt der Fall ist, sondern gleich drei:

  1. Die Speichernutzung
  2. Die Ausführungszeit bzw. Anzahl der Durchgänge des Algorithmus
  3. Die Anzahl der parallel genutzten Threads

Resultierend daraus besitzt PHP jetzt eine neue Konstante PASSWORD_ARGON2I für den neuen Hashing-Algorithmus sowie drei Konstanten, die jeweils den Standardwert (in Klammern angegeben) der drei Kostenfaktoren repräsentieren:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST (1024 KiB bzw. 1<<10)
  • PASSWORD_ARGON2_DEFAULT_TIME_COST (2)
  • PASSWORD_ARGON2_DEFAULT_THREADS (2)

Möchte man nun also den neuen Hash-Algorithmus Argon2 zum Hashen von Passwörtern nutzen, ist dies mit der Funktion password_hash() ohne Probleme möglich.

password_hash('password', PASSWORD_ARGON2I);

Gibt man kein Array mit Optionen als drittes Argument an, werden die zuvor besprochenen Standardwerte genutzt.

Möchte man stattdessen Optionen setzen und die Funktion damit ein wenig an den eigenen Server und deren Leistung anpassen, kann dies so erfolgen:

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

Bye bye, Mcrypt! Hallo, Sodium!

Neben neuen Features, die hinzugefügt werden, gibt es auch immer ein paar Sachen, die aussortiert werden. Dies trifft bei PHP 7.2 auf die Mcrypt-Erweiterung zu, welche komplett aus dem PHP Core entfernt wurde.

Der Grund: Mcrypt wird nicht mehr aktiv weiterentwickelt, beinhaltet einige Sicherheitslücken, ist generell nicht mehr auf einem modernen Stand und lässt sich gut durch OpenSSL ersetzen. Dementsprechend hat sich das PHP-Team also entschieden, Mcrypt zu entfernen, um die Scriptsprache in gewisser Weise auch “sauber” zu halten.

Im Gegenzug zur Entfernung der Kryptografie-Bibliothek libmcrypt wurde gleich eine Neue mit der Bibliothek libsodium hinzugefügt, welche bisher nur über PECL als Erweiterung genutzt werden konnte. Nun tauscht die Sodium-Erweiterung praktisch den Platz mit der Mcrypt-Erweiterung, was ein gutes Zeichen für ein modernes und sicheres PHP ist.

Deprecations: Diese Features werden bald entfernt

Bevor Features aus PHP komplett entfernt werden, müssen diese erstmal “deprecated” (als veraltet abgestempelt) werden und können dann in der nächsten Hauptversion entfernt werden. Auch in PHP 7.2 wurden wieder einige Funktionen auf diese Liste gesetzt, sodass sie voraussichtlich ab PHP 8.0 kein Bestandteil des PHP-Standards mehr sind:

Falls ihr noch eine dieser Features einsetzt, sollte ihr euch dringend nach einer Alternative umschauen.

Fazit

Zusammenfassend lässt sich sagen, dass PHP 7.2 einige nette Änderungen mit sich bringt. Besonders der Object Typehint sowie der neue Hash-Algorithmus sind doch Neuerungen, die man nur sehr begrüßen kann. Ich werde diese mit Sicherheit bald in meine Anwendungen einbauen.

Ich hoffe, ihr konntet einen kleinen Überblick über PHP 7.2 gewinnen und freut euch, genauso wie ich, auf den Einsatz der neuen Features.

Weiterführende Links / Quellen