PHP ist eine der Pro­gram­mier­spra­chen, die am ein­fachs­ten zu lernen ist. Mit einem PHP-Tutorial und der richtigen Mo­ti­va­ti­on, kann man innerhalb weniger Stunden die ersten Skripte schreiben und Befehle ausführen. PHP 7 hat  bereits eine starke Ge­schwin­dig­keits­op­ti­mie­rung gebracht, die zu einem ver­bes­ser­ten Ranking führte. Nun hat die Open-Source-Sprache ein Major-Update auf Version 8.0 erhalten. Ein Jahr später folgt auch schon das kleinere Update auf 8.1.

Welche Features kommen mit PHP 8.1?

PHP 8.1 ist in­zwi­schen in der Beta-Version er­schie­nen und wird gerade getestet. Das end­gül­ti­ge Update folgt zwar erst im November 2021, doch die neuen Features sind bereits bekannt. Auf folgende Neue­run­gen können Sie sich ein­stel­len:

  • Enum: So­ge­nann­te Enu­me­ra­ti­ons (Auf­zäh­lun­gen mit einer bestimmen Anzahl von Werten) sind nun als Va­ria­blen­typ verfügbar.
  • Fibers: Der neue Code-Block-Typus Fibers gibt Ihnen die Mög­lich­keit, mehrere Pro­gramm­fä­den parallel aus­zu­füh­ren.
  • Arrays: Seit PHP 7.4 kann man Arrays mit nu­me­ri­schen Werten entpacken. Nun ist dies auch für Arrays mit Strings möglich.
  • Readonly: Klas­sen­ei­gen­schaf­ten können von nun an als Readonly markiert werden und sind somit nicht mehr ver­än­der­bar.
  • In­ter­sec­tion: In­ter­sec­tion Types (im Prinzip die Ge­gen­spie­ler zu den Union Types) sind nun verfügbar.
  • Never: Der neue Rück­ga­be­wert ‚never‘ zeigt an, dass eine Funktion beendet wird und keinen anderen Wert zu­rück­lie­fert.
  • Final: Man kann Klas­sen­kon­stan­ten nun mit ‚final‘ markieren, damit sie nicht von Un­ter­klas­sen geändert werden können.
  • Fsync: Mit PHP 8.1 werden die beiden Funk­tio­nen ‚fsync‘ und ‚fdatasync‘ ein­ge­führt, um Daten aus dem Buffer auf das Spei­cher­me­di­um zu syn­chro­ni­sie­ren.
  • Octal: Um das Ok­tal­zah­len­sys­tem an­zu­zei­gen, kann man künftig zu­sätz­lich zu ‚0‘ (Null) auch das Präfix ‚0o‘ (Null und kleines O) verwenden.
  • Globals: Die Nutzung von ‚$GLOBALS‘ wurde leicht ein­ge­schränkt und führt nun in manchen Fällen zu einer Error-Nachricht.
  • Null: Interne Funk­tio­nen ak­zep­tie­ren fortan keine Null-Werte mehr bei Non-nullable-Ar­gu­men­ten.
Hinweis

Dies ist nur eine Auswahl der in­ter­es­san­tes­ten Än­de­run­gen in PHP 8.1. Viele weitere geplante Neue­run­gen finden Sie in der of­fi­zi­el­len Wiki mit allen Request for Comments.

PHP 8: Release im November 2020

Am 26. November 2020 war es so weit: Mit dem Major-Release PHP 8.0.0 wurde die neueste Ausgabe der beliebten Skript­spra­che ver­öf­fent­licht. Dies ent­spricht dem normalen Drei-Jahres-Zyklus bei PHP. Der Vorgänger PHP 7.4 war zuvor rund ein Jahr lang aktiv, nachdem u. a. der Support für PHP 7.1 ein­ge­stellt worden war. Auch der Support für PHP 7.2 ging Ende 2020 zu Ende.

Viele Websites, die mit PHP ge­schrie­ben wurden, setzen dennoch auf die alten Versionen. Dies ist zwar prin­zi­pi­ell möglich, al­ler­dings nicht zu empfehlen. Den Code der Website aktuell zu halten und auf neue Versionen von PHP um­zu­stei­gen bringt nämlich ver­schie­de­ne Vorteile mit sich: Neue Funk­tio­nen bieten mehr Vielfalt, die Per­for­mance kann massiv ge­stei­gert werden und Si­cher­heits­lü­cken werden ge­schlos­sen.

PHP 8 schon jetzt probieren!

Sie sind noch kein IONOS-Kunde? Dann buchen Sie jetzt eines unserer günstigen Web­hos­ting-Angebote. An­schlie­ßend können Sie in Ihrem IONOS-Kun­den­kon­to die ver­wen­de­te PHP-Version ändern und zu PHP 8 bzw. PHP 8.1 (sobald verfügbar) wechseln.

Gibt es Kom­pli­ka­tio­nen mit altem Code?

Da PHP 8 eine neue Haupt­ver­si­on ist, muss man damit rechnen, dass alter Code nicht mehr kom­pa­ti­bel sein kann. Die meisten Än­de­run­gen, die zu Kom­pli­ka­tio­nen führen könnten, waren al­ler­dings schon in Version 7.2, 7.3 und 7.4 veraltet.

Zu den aktuellen Än­de­run­gen gehören:

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Re­flec­tion export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

Wer seinen Code bisher immer up to date gehalten hat, wird kaum Probleme haben, auch wenn das neue Update ein Major-Release ohne ab­wärts­kom­pa­ti­ble Än­de­run­gen ist. Eine komplette Auf­lis­tung aller Än­de­run­gen kann man auf der of­fi­zi­el­len PHP-Pro­jekt­sei­te einsehen.

Hinweis

Microsoft hat bekannt gegeben, dass das Un­ter­neh­men für PHP 8 und spätere Versionen keinen Windows-Support mehr anbieten wird. Die PHP-Ent­wick­ler haben al­ler­dings bereits an­ge­kün­digt, diese Lücke selbst schließen zu wollen.

Das sind die neuen PHP-8-Features

Die neue Version von PHP birgt einige Neue­run­gen, die Web­ent­wick­lern viele zu­sätz­li­che Mög­lich­kei­ten bieten. Die wich­tigs­ten An­pas­sun­gen gegenüber den Vor­gän­gern haben wir im Folgenden für Sie zu­sam­men­ge­fasst.

Hinweis

Am 30. November 2020 erreicht die PHP 7.2 Version das of­fi­zi­el­le End-of-Life-Datum (EOL) und wird nicht mehr un­ter­stützt. Mehr dazu finden Sie in unserem Artikel zu diesem Thema.

JIT Compiler

Die größte Neuerung ist der JIT Compiler, der die Per­for­mance erheblich ver­bes­sern soll. PHP wird nicht kom­pi­liert, sondern Zeile für Zeile in­ter­pre­tiert. Der JIT Compiler (JIT = Just in Time) kom­pi­liert nun Teile des Codes während der Laufzeit – und wirkt somit ganz ähnlich wie eine gecachte Version des Codes.

Dieses neue Feature in PHP 8 wurde auch bereits von Pedro Escudero ein­drucks­voll getestet. Er hat ein simples Script genutzt und damit die Versionen 5.3, 7.4 und 8 (mit und ohne JIT) ver­gli­chen. Hierfür hat er das Script in jeder Version 100-mal laufen lassen und an­schlie­ßend die Durch­schnitts­zeit ermittelt.

Dabei sind folgende Durch­schnitts­wer­te ent­stan­den:

Version Zeit in Sekunden
5.3 0.64574003219604
7.4 0.10253500938416
8 (ohne JIT) 0.098223924636841
8 (mit JIT) 0.053637981414795

Auch wenn der Wechsel von Version 7.4 zu 8 ohne JIT keinen großen Un­ter­schied macht, so ist der Un­ter­schied zu Version 8 mit JIT erheblich. Der JIT Compiler sorgt für ein Per­for­mance-Upgrade von mehr als 45 Prozent.

Union Types

Union Types kennt man bereits aus anderen Sprachen wie C/C++, Ty­pe­Script oder auch Haskell. Hierbei können zwei oder mehrere Typen eine Union eingehen und jeder der genannten Typen kann verwendet werden. Im Code selbst kann dies fol­gen­der­wei­se aussehen:

public function foo(Foo|Bar $input): int|float;

Es gibt jedoch eine Ein­schrän­kung, denn void kann nicht Teil eines Union Types werden, da es keinen Rück­ga­be­wert ausgibt. Außerdem können nullable Unions mit |null oder ? ge­schrie­ben werden, wie in diesem Beispiel

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Static return type

Static ist ein spe­zi­el­ler Klas­sen­na­me und wird in der neuen Version neben self & parent zu einem validen Return Type.

WeakMap

WeakRefs wurden bereits in PHP 7.4 hin­zu­ge­fügt, PHP 8 liefert mit WeakMaps die Er­wei­te­rung dieser Funktion. WeakMaps und WeakRefs können dazu genutzt werden, Objekte zu löschen, wenn nur noch der Cache auf die En­ti­täts­klas­sen der Objekte re­fe­ren­ziert. Dies führt zu einem res­sour­cen­scho­nen­den Umgang mit den Objekten. Ein Beispiel aus der Do­ku­men­ta­ti­on:

class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    // ...
}

::class bei Objekten verwenden

In früheren Versionen musste man get_class() benutzen, um Objekten eine Klasse zu­zu­wei­sen. Nun können Sie ::class auf Objekte anwenden, was den Quelltext schlanker hält.

Stringab­le interface

Das Stringab­le interface wird au­to­ma­tisch zu Klassen hin­zu­ge­fügt, die die __toString()-Methode im­ple­men­tie­ren. Dieser Schritt musste bisher manuell vollzogen werden. Im Code selbst sieht das dann fol­gen­der­ma­ßen aus:

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');

fdiv()-Funktion

Durch die neue Funktion fdiv() ist eine Division durch 0 erlaubt. Man erhält nun INF, -INF oder NAN als Rück­ga­be­wert.

Typen-Fehler (Type errors)

Bisher lösten nur be­nut­zer­de­fi­nier­te Funk­tio­nen Ty­peEr­rors aus, interne Funk­tio­nen haben eine Warnung und null aus­ge­ge­ben. In PHP 8 geben nun auch die meisten internen Funk­tio­nen einen Typen-Fehler aus.

Neue Klas­si­fi­zie­rung von Engine-Warnings

Bisher gab es viele Fehler, die nur eine Warnung oder einen Hinweis aus­ge­ge­ben haben. Dies wurde nun ak­tua­li­siert. Eine voll­stän­di­ge Auf­lis­tung der neuen PHP-Feh­ler­mel­dun­gen finden Sie in der Do­ku­men­ta­ti­on.

Korrekte Si­gna­tu­ren magischer Methoden

In den bis­he­ri­gen PHP-Versionen war es möglich, magische Methoden mit Si­gna­tu­ren zu schreiben, die nicht mit der er­war­te­ten Signatur über­ein­stim­men, bei­spiels­wei­se __clone(): float oder __isset(): Closure. Seit der Ein­füh­rung von PHP 7.0 wurde die korrekte Anwendung der magischen Methoden nur stich­pro­ben­ar­tig überprüft. Die neue Version ist um diverse Parameter- und Rück­ga­be­wert-Checks ergänzt worden, um die Kor­rekt­heit der Si­gna­tu­ren si­cher­zu­stel­len.

Re­flec­tion

Die Re­flec­tion-Si­gna­tu­ren wurden geändert. Ur­sprüng­lich wurde Re­flec­tion fol­gen­der­wei­se angegeben:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

In PHP 8 wird es nun fol­gen­der­ma­ßen ge­schrie­ben:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

Um PHP 7 & PHP 8 gleich­zei­tig zu un­ter­stüt­zen, können Sie den Code fol­gen­der­wei­se for­mu­lie­ren:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);
Tipp

Sie sind noch nicht mit einer eigenen Website aktiv? Das Dedicated Hosting von IONOS ist leis­tungs­stark und auch für Ein­stei­ger emp­feh­lens­wert. Besonders viel Fle­xi­bi­li­tät bei bester Per­for­mance erwartet Sie außerdem bei den vir­tu­el­len Servern von IONOS. Ent­schei­den Sie sich für das Angebot, das am besten zu Ihrem Projekt passt.

Zum Hauptmenü