# PHP 8: Alle Informationen zur neuen Version

PHP ist eine der Programmiersprachen, die am einfachsten zu lernen ist. Mit einem [PHP-Tutorial](https://www.ionos.at/digitalguide/websites/webseiten-erstellen/php-lernen-leicht-gemacht-das-grosse-einsteiger-tutorial/ "PHP-Lernen leicht gemacht: Das große Einsteiger-Tutorial") und der richtigen Motivation, kann man innerhalb weniger Stunden die ersten Skripte schreiben und Befehle ausführen. [PHP 7](https://www.ionos.at/digitalguide/websites/web-entwicklung/php7-kuerzere-lade-und-zugriffzeiten-im-web/ "PHP7: kürzere Lade- und Zugriffzeiten im Web") hat bereits eine starke Geschwindigkeitsoptimierung gebracht, die zu einem verbesserten 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 inzwischen in der Beta-Version erschienen und wird gerade getestet. Das endgültige Update folgt zwar erst im **November 2021**, doch die neuen Features sind bereits bekannt. Auf folgende Neuerungen können Sie sich einstellen:

- [Enum](https://wiki.php.net/rfc/enumerations "Offizieller RFC zu Enums"): Sogenannte Enumerations (Aufzählungen mit einer bestimmen Anzahl von Werten) sind nun als Variablentyp verfügbar.
- [Fibers](https://wiki.php.net/rfc/fibers "Offizieller RFC zu Fibers"): Der neue Code-Block-Typus Fibers gibt Ihnen die Möglichkeit, mehrere Programmfäden parallel auszuführen.
- [Arrays](https://wiki.php.net/rfc/array_unpacking_string_keys "Offizieller RFC zu Array unpacking"): Seit PHP 7.4 kann man Arrays mit numerischen Werten entpacken. Nun ist dies auch für Arrays mit Strings möglich.
- [Readonly](https://wiki.php.net/rfc/readonly_properties_v2 "Offizieller RFC zu Readonly"): Klasseneigenschaften können von nun an als Readonly markiert werden und sind somit nicht mehr veränderbar.
- [Intersection](https://wiki.php.net/rfc/pure-intersection-types "Offizieller RFC zu Intersection Types"): Intersection Types (im Prinzip die Gegenspieler zu den Union Types) sind nun verfügbar.
- [Never](https://wiki.php.net/rfc/noreturn_type "Offizieller RFC zum never return type"): Der neue Rückgabewert ‚never‘ zeigt an, dass eine Funktion beendet wird und keinen anderen Wert zurückliefert.
- [Final](https://wiki.php.net/rfc/final_class_const "Offizieller RFC zur final flag"): Man kann Klassenkonstanten nun mit ‚final‘ markieren, damit sie nicht von Unterklassen geändert werden können.
- [Fsync](https://wiki.php.net/rfc/fsync_function "Offizieller RFC zu fsync"): Mit PHP 8.1 werden die beiden Funktionen ‚fsync‘ und ‚fdatasync‘ eingeführt, um Daten aus dem Buffer auf das Speichermedium zu synchronisieren.
- [Octal](https://wiki.php.net/rfc/explicit_octal_notation "Offizieller RFC zum octal prefix"): Um das Oktalzahlensystem anzuzeigen, kann man künftig zusätzlich zu ‚0‘ (Null) auch das Präfix ‚0o‘ (Null und kleines O) verwenden.
- [Globals](https://wiki.php.net/rfc/restrict_globals_usage "Offizieller RFC zu $GLOBALS"): Die Nutzung von ‚$GLOBALS‘ wurde leicht eingeschränkt und führt nun in manchen Fällen zu einer Error-Nachricht.
- [Null](https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg "Offizieller RFC zu Null"): Interne Funktionen akzeptieren fortan keine Null-Werte mehr bei Non-nullable-Argumenten.

---

### Hinweis

Dies ist nur eine Auswahl der interessantesten Änderungen in PHP 8.1. Viele weitere geplante Neuerungen finden Sie in der [offiziellen Wiki mit allen Request for Comments](https://wiki.php.net/rfc "Wiki zu PHP").

---

## 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 Skriptsprache veröffentlicht. Dies entspricht 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](https://www.ionos.at/digitalguide/websites/web-entwicklung/php-71/ "PHP 7.1") eingestellt worden war. Auch der Support für PHP 7.2 ging Ende 2020 zu Ende.

Viele Websites, die mit PHP geschrieben wurden, setzen dennoch auf die alten Versionen. Dies ist zwar prinzipiell möglich, allerdings nicht zu empfehlen. Den **Code der Website aktuell zu halten** und auf neue Versionen von PHP umzusteigen bringt nämlich verschiedene Vorteile mit sich: Neue Funktionen bieten mehr Vielfalt, die Performance kann massiv gesteigert werden und Sicherheitslücken werden geschlossen.

---

### PHP 8 schon jetzt probieren!

Sie sind noch kein IONOS-Kunde? Dann buchen Sie jetzt eines unserer [günstigen Webhosting-Angebote](https://www.ionos.at/hosting/webhosting "Webhosting"). Anschließend können Sie in Ihrem [IONOS-Kundenkonto die verwendete PHP-Version ändern](https://www.ionos.de/hilfe/hosting/php-version-im-control-center-verwalten/aktive-php-version-anzeigen-oder-aendern/ "PHP Version im IONOS Konto ändern") und zu PHP 8 bzw. PHP 8.1 (sobald verfügbar) wechseln.

---

## Gibt es Komplikationen mit altem Code?

Da PHP 8 eine neue Hauptversion ist, muss man damit rechnen, dass alter Code nicht mehr kompatibel sein kann. Die meisten Änderungen, die zu Komplikationen führen könnten, waren allerdings schon in Version [7.2](https://wiki.php.net/rfc/deprecations_php_7_2 "Deprecations von PHP 7.2"), [7.3](https://wiki.php.net/rfc/deprecations_php_7_3 "Deprecations von PHP 7.3") und [7.4](https://wiki.php.net/rfc/deprecations_php_7_4 "Deprecations von PHP 7.4") veraltet.

Zu den aktuellen Änderungen gehören:

- The *real* type
- Magic quotes legacy
- *array\_key\_exists()* with objects
- *FILTER\_SANITIZE\_MAGIC\_QUOTES* filter
- Reflection *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 abwärtskompatible Änderungen** ist. Eine komplette Auflistung aller Änderungen kann man auf der offiziellen [PHP-Projektseite](https://www.php.net/releases/8.0/de.php?lang=de "php.net: PHP 8.0.0 Release Announcement") einsehen.

---

### Hinweis

Microsoft hat bekannt gegeben, dass das Unternehmen für PHP 8 und spätere Versionen keinen Windows-Support mehr anbieten wird. Die PHP-Entwickler haben allerdings bereits angekündigt, diese Lücke selbst schließen zu wollen.

---

## Das sind die neuen PHP-8-Features

Die neue Version von PHP birgt einige Neuerungen, die Webentwicklern viele zusätzliche Möglichkeiten bieten. Die wichtigsten Anpassungen gegenüber den Vorgängern haben wir im Folgenden für Sie zusammengefasst.

---

### Hinweis

Am **30. November 2020** erreicht die [PHP 7.2](https://www.ionos.at/digitalguide/websites/web-entwicklung/php-72/ "PHP 7.2") Version das offizielle **End-of-Life-Datum (EOL)** und wird nicht mehr unterstützt. Mehr dazu finden Sie in unserem Artikel zu diesem Thema.

---

### JIT Compiler

Die größte Neuerung ist der **JIT Compiler**, der die Performance erheblich verbessern soll. PHP wird nicht kompiliert, sondern Zeile für Zeile interpretiert. Der JIT Compiler (JIT = Just in Time) kompiliert 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](https://levelup.gitconnected.com/how-fast-is-php-8-going-to-be-f7fdc111cd6 "Testbericht zum JIT Compiler") eindrucksvoll getestet. Er hat ein simples Script genutzt und damit die Versionen 5.3, 7.4 und 8 (mit und ohne JIT) verglichen. Hierfür hat er das Script in jeder Version 100-mal laufen lassen und anschließend die Durchschnittszeit ermittelt.

Dabei sind folgende Durchschnittswerte entstanden:

<table>
  <thead>
    <tr>
      <th>Version</th>
      <th>Zeit in Sekunden</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>5.3</td>
      <td>0.64574003219604</td>
    </tr>
    <tr>
      <td>7.4</td>
      <td>0.10253500938416</td>
    </tr>
    <tr>
      <td>8 (ohne JIT)</td>
      <td>0.098223924636841</td>
    </tr>
    <tr>
      <td>8 (mit JIT)</td>
      <td>0.053637981414795</td>
    </tr>
  </tbody>
</table>

Auch wenn der Wechsel von Version 7.4 zu 8 ohne JIT keinen großen Unterschied macht, so ist der Unterschied zu Version 8 mit JIT erheblich. Der JIT Compiler sorgt für ein **Performance-Upgrade von mehr als 45 Prozent.**

### Union Types

Union Types kennt man bereits aus anderen Sprachen wie C/C++, TypeScript 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 folgenderweise aussehen:

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

Es gibt jedoch eine Einschränkung, denn void* kann nicht Teil eines Union Types werden, da es keinen Rückgabewert ausgibt. Außerdem können *nullable* Unions mit *|null* oder ?* geschrieben werden, wie in diesem Beispiel

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

### Static return type

*Static* ist ein spezieller Klassenname und wird in der neuen Version neben *self* &amp; *parent* zu einem validen Return Type.

### WeakMap

WeakRefs wurden bereits in PHP 7.4 hinzugefügt, PHP 8 liefert mit WeakMaps die Erweiterung dieser Funktion. WeakMaps und WeakRefs können dazu genutzt werden, Objekte zu löschen, wenn nur noch der Cache auf die Entitätsklassen der Objekte referenziert. Dies führt zu einem **ressourcenschonenden Umgang mit den Objekten**. Ein Beispiel aus der Dokumentation:

```none
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 zuzuweisen. Nun können Sie *::class* auf Objekte anwenden, was den Quelltext schlanker hält.

### Stringable interface

Das Stringable interface wird automatisch zu Klassen hinzugefügt, die die \_\_*toString()*-Methode implementieren. Dieser Schritt musste bisher manuell vollzogen werden. Im Code selbst sieht das dann folgendermaßen aus:

```none
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ückgabewert.

### Typen-Fehler (Type errors)

Bisher lösten nur benutzerdefinierte Funktionen *TypeErrors* aus, interne Funktionen haben eine Warnung und null ausgegeben. In PHP 8 geben nun auch die meisten internen Funktionen einen Typen-Fehler aus.

### Neue Klassifizierung von Engine-Warnings

Bisher gab es viele Fehler, die nur eine Warnung oder einen Hinweis ausgegeben haben. Dies wurde nun aktualisiert. Eine [vollständige Auflistung der neuen PHP-Fehlermeldungen](https://wiki.php.net/rfc/engine_warnings "Offizielle Auflistung von Warnungen bei PHP") finden Sie in der Dokumentation.

### Korrekte Signaturen magischer Methoden

In den bisherigen PHP-Versionen war es möglich, magische Methoden mit Signaturen zu schreiben, die nicht mit der erwarteten Signatur übereinstimmen, beispielsweise *\_\_clone(): float* oder *\_\_isset(): Closure*. Seit der Einführung von PHP 7.0 wurde die korrekte Anwendung der magischen Methoden nur stichprobenartig überprüft. Die neue Version ist um diverse Parameter- und Rückgabewert-Checks ergänzt worden, um die Korrektheit der Signaturen sicherzustellen.

### Reflection

Die Reflection-Signaturen wurden geändert. Ursprünglich wurde Reflection folgenderweise angegeben:

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

In PHP 8 wird es nun folgendermaßen geschrieben:

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

Um PHP 7 &amp; PHP 8 gleichzeitig zu unterstützen, können Sie den Code folgenderweise formulieren:

```none
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](https://www.ionos.at/hosting/dedicated-hosting "Dedicated Hosting") von IONOS ist leistungsstark und auch für Einsteiger empfehlenswert. Besonders viel Flexibilität bei bester Performance erwartet Sie außerdem bei den [virtuellen Servern](https://www.ionos.at/server/vps "vServer günstig mieten – Windows o. Linux – IONOS") von IONOS. Entscheiden Sie sich für das Angebot, das am besten zu Ihrem Projekt passt.

---


This is a markdown version of: [https://www.ionos.at/digitalguide/websites/web-entwicklung/php-8/](https://www.ionos.at/digitalguide/websites/web-entwicklung/php-8/) for AI/LLM consumption.