© galacticus/Shutterstock.com, HappyPictures/Shutterstock.com
PHP 8.0: mehr als nur ein JIT-Compiler

Sprung in die Zukunft


Mit dem Release von PHP 7.0 im Jahr 2015 wurde eine neue Ära eingeleitet. Doch jetzt steht PHP 8.0 mit vielen spannenden neuen Features vor der Tür. In diesem Artikel möchte ich die neuen Möglichkeiten vorstellen und genauer erläutern. Die Features sind schon im offiziellen PHP Wiki [1] definiert. Das heißt, dass einige der Features aus diesem Artikel eventuell schon umgesetzt wurden und andere kurz vor der Umsetzung stehen.

Den Artikel möchte ich mit bereits umgesetzten Features beginnen. Diese sind im Wiki bereits als „implemented“ [2] definiert. Es kann also sein, dass zum Zeitpunkt des Erscheinens des vorliegenden PHP Magazins bereits weitere Features implementiert wurden. Daher bitte ich vorab um Verständnis, dass eventuell wichtige Feature hier nicht beschrieben werden.

str_starts_with() und str_ends_with()

Die ersten Funktionen, die ich auf jeden Fall in der neuen PHP-Version implementieren werde, sind str_starts_with() und str_ends_with() [3]. Sie werden sehr oft in vielen Frameworks abgefragt. Die aktuellen Lösungen wie etwa

substr($haystack,0,strlen($needle)) === $needle; // oder strpos($haystack,$needle) === 0

sind nicht effizient, wenn es um CPU oder Arbeitsspeicherverbrauch geht. Die strncmp()-Funktionen sind zwar besser, aber sie verlangen immer die $needle-Länge als Parameter. Dadurch müsste man entweder mit strlen oder mb_strlen den gesuchten String noch einmal analysieren. Bei den Vergleichen, ob der String mit einem String endet, muss man zusätzlich in einigen Fällen den String umkehren damit man den gesuchten Wert ans Ende bringt oder man arbeitet mit sbstr_compare, was auch die Länge als Parameter benötigt. Außerdem werden in einigen Fällen noch if-Statements verlangt; wenn zum Beispiel ein $needle leer oder länger ist als ein $haystack, kann es manchmal eine Warnung geben.

Wenn Frameworks diese Funktionen implementieren, erzeugen sie aber dadurch natürlich einen Backwards Compatibility Break, weil die Funktion erst ab PHP 8 zur Verfügung steht. Mit einem Wrapper ließe sich das aber relativ einfach lösen.

Konstante class für das stdClass

Ein weiteres Feature, auf das ich mich freue, ist die class-Konstante in einem Objekt [4]. In allen Klassen können wir aktuell auf die Konstante class zugreifen, um den Namen sowie Namespace der Klasse zu ermitteln. Es existiert aber die Sonderklasse stdClass. Diese wird zum Beispiel aus einem JSON angelegt oder wenn wir einen Datensatz aus der Datenbank auslesen, u. a. mit PDO::FETCH_OBJ. Die generische Klasse hat aktuell nicht die Konstante und der Aufruf der Konstante führt zu einem Fehler. Bei einer schwachen Typisierung kann es durchaus vorkommen, dass man eine Sammlung von Klassen hat, die gemischt mit solch einer generischen Klasse vorliegen. So etwas kommt zwar selten vor, aber es überrascht dann einen doch sehr, wieso eine PHP-interne Klasse die Konstante nicht hat.

Stringable-Interface

Zu den vielen internen Interfaces kommt ein weiteres hinzu, das Stringable-Interface [5]:

interface Stringable { public function __toString():string; }

In PHP gibt es die magische Methode __toString() [6]. Mit dieser Methode kann man ein Objekt mit einem echo oder innerhalb eines Texts mittels String-Konkatenation ausgeben. Allerdings musste man vorher immer mit method_exists() überprüfen, ob das Objekt auch wirklich ausgegeben werden kann. In manchen Fällen wurde sogar ein eigenes Interface für einen Typehint entwickelt.

Mit dem nativen Interface muss man aber bedenken, dass, wenn man es implementiert und die eigene Methode __toString keinen return Type hat, PHP eine Fehlermeldung anzeigen wird, da es vom Interface verlangt wird.

Syntaxanpassungen der Variablen

In der neuen PHP-Version gibt auch einige interessante Anpassungen bezüglich der Variablensyntax. Ich vermute, hier sollte man bei einer Umstellung genauer hinsehen.

Aktuell darf man einer Konstante einen Array zuweisen und dann mit FOO[0] auf das Array zugreifen. Allerdings gibt es noch magische Konsta...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang