---
title: 'PHP 7.2 from 7.1: object Type, Widening, Libsodium & Migration | DevSense'
description: 'Upgrade-Leitfaden für PHP 7.2: object-Typ-Hint, Parameter-Type-Widening, detailliertere PDO-Debug-Dumps, LDAP EXOP, addrinfo-Sockets-API, libsodium – plus BC-Breaks (count, get_class, object/array-Casts) und mcrypt-Entfernung zu PECL.'
faq:
    - { question: "Was ist der neue 'object'-Typ-Hint in PHP 7.2?", answer: "PHP 7.2 führt einen generischen 'object'-Typ-Hint für Funktionsparameter und Rückgabetypen ein. Dies ermöglicht es, jede beliebige Objektinstanz zu übergeben oder zurückzugeben." }
    - { question: 'Was ist Parameter-Type-Widening?', answer: 'Parameter-Type-Widening (Typaufweichung) erlaubt es einer Methode in einer Unterklasse, Typ-Hints bei ihren Parametern wegzulassen, die in der Methode der Elternklasse oder des Interfaces vorhanden sind. Dies steht im Einklang mit dem Liskovschen Substitutionsprinzip (LSP).' }
    - { question: "Wie ändert sich die Funktion 'count()' in PHP 7.2?", answer: "Der Aufruf von 'count()' auf nicht-zählbaren Typen (wie null, Integern, Booleans oder Klassen, die Countable nicht implementieren) erzeugt nun ein E_WARNING." }
    - { question: 'Was ist mit der mcrypt-Erweiterung in PHP 7.2 passiert?', answer: 'Die mcrypt-Erweiterung wurde vollständig aus dem PHP-Core entfernt und nach PECL verschoben. Entwickler werden gebeten, auf OpenSSL oder die neu integrierte Sodium-Erweiterung zu migrieren.' }
published: '2026-05-31'
---
# PHP 7.2: Hauptmerkmale

Was wäre, wenn das Abfragen der Länge einer Variable plötzlich Ihre Fehlerprotokolle mit Warnungen überfluten würde? PHP 7.2 führt eine strenge count-Warnungshygiene ein und deckt damit Tausende von versteckten Fehlern auf, bei denen Entwickler `count()` auf nicht-zählbaren Typen wie null oder boolean aufgerufen haben. Es optimiert die alltägliche Entwicklung durch den generischen `object`-Typ-Hint, Parameter-Type-Widening, die standardmäßige Integration von libsodium und die strenge count-Warnungshygiene.

## Inhalt
* [`object`-Typ](#object-type)
* [Parameter-Type-Widening](#type-widening)
* [PDO: Erweiterte `debugDumpParams()`](#pdo-debug)
* [LDAP Extended Operations (EXOP)](#ldap-exop)
* [Sockets: `socket_addrinfo_*`](#sockets-addrinfo)
* [Sodium (libsodium) im Core](#sodium)
* [Bemerkenswerte Erweiterungen & Stdlib](#extensions-stdlib)
* [Praktische Rezepte](#practical-recipes)
* [Häufige Fehler](#common-mistakes)
* [Einschränkungen](#limitations)
* [Rückwärtskompatibilität und BC-Breaks](#backward-incompatible)
* [Veraltete Features (frühzeitig beheben)](#deprecations)
* [Weitere Änderungen & Build-Details](#other-changes)
* [Interaktives Quiz](#interactive-quiz)
* [Schlussgedanken](#closing-thoughts)

---

<a id="object-type"></a>
## `object`-Typ

Sie können **`object`** für Parameter und Rückgabetypen deklarieren – jede Instanz erfüllt diese Bedingung. Dies harmoniert mit den Regeln zur Kovarianz von Rückgabetypen und Kontravarianz von Parametern, die sich in PHP über die 7.x-Reihe hinweg entwickelt haben.

```php
// src/ObjectHandler.php
function acceptsAnyObject(object $x): void 
{
    // Etwas mit dem Objekt tun
}
```

> [!NOTE]
> Wussten Sie schon? Vor PHP 7.2 konnten Sie keine generischen Objekte als Typ-Hint angeben. Entwickler mussten sich auf PHPDoc-Annotationen verlassen oder manuell `is_object()` prüfen.

---

<a id="type-widening"></a>
## Parameter-Type-Widening

Implementierungen können **Parameter-Typ-Hints weglassen**, die in der Methode der Elternklasse oder des Interfaces definiert sind (immer noch kontravarianz-sicher). Sie können den Typ in abstrakten/Interface-Ketten **nicht** verengen oder in einen nicht verwandten Typ ändern – PHP weist inkompatible Überschreibungen ab.

```php
// src/Logger.php
interface Logger {
    public function log(string $msg);
}

class MyLogger implements Logger {
    // Der Parametertyp wird weggelassen (aufgeweitet), was in PHP 7.2 gültig ist
    public function log($msg) {
        echo $msg;
    }
}
```

> [!NOTE]
> Wussten Sie schon? Parameter-Type-Widening ermöglicht es Bibliotheken, ihre Interfaces zu aktualisieren, ohne sofort Implementierungen von Drittanbietern unbrauchbar zu machen, da Unterklassen den Typ-Hint weglassen können.

---

<a id="pdo-debug"></a>
## PDO: Erweiterte `debugDumpParams()`

`PDOStatement::debugDumpParams()` kann das **vollständige SQL** anzeigen, das bei **emulierten Prepares** an den Server gesendet wurde, einschließlich der gebundenen Werte. Dies ist sehr nützlich beim Debuggen der Query-Konstruktion (nur bei aktivierter Emulation).

```php
// src/DatabaseDebug.php
$stmt = $pdo->prepare("SELECT * FROM users WHERE status = :status");
$stmt->execute(['status' => 'active']);
$stmt->debugDumpParams();
```

---

<a id="ldap-exop"></a>
## LDAP Extended Operations (EXOP)

Neue Hilfsfunktionen wie **`ldap_exop()`**, **`ldap_exop_passwd()`**, **`ldap_exop_whoami()`**, **`ldap_parse_exop()`** sowie Konstanten wie **`LDAP_EXOP_START_TLS`** – decken gängige EXOP-Workflows ab, ohne dass roher LDAP-Code geschrieben werden muss.

---

<a id="sockets-addrinfo"></a>
## Sockets: `socket_addrinfo_*`

**`socket_addrinfo_lookup()`**, **`socket_addrinfo_connect()`**, **`socket_addrinfo_bind()`**, **`socket_addrinfo_explain()`** kapseln die Auflösung und den Verbindungsaufbau im Stil von **`getaddrinfo()`** – bevorzugen Sie dies gegenüber der manuellen `AF_INET`-Analyse, wenn Sie moderne Adressfamilien benötigen.

---

<a id="sodium"></a>
## Sodium (libsodium) im Core

Die **Sodium**-Erweiterung wird standardmäßig mit PHP 7.2+ ausgeliefert und stellt die AEAD-, Hashing- und KDF-Primitiven von libsodium bereit. Betrachten Sie sie als Standardweg für **neue Kryptographie** anstelle von **mcrypt** (das aus dem Core entfernt wurde – siehe unten).

```php
// src/CryptoHelper.php
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$key = sodium_crypto_secretbox_keygen();
$ciphertext = sodium_crypto_secretbox('message', $nonce, $key);
```

---

<a id="extensions-stdlib"></a>
## Bemerkenswerte Erweiterungen & Stdlib

* **`utf8_encode()` / `utf8_decode()`** wurden in die **Core-String-Funktionen** verschoben (sie sind nicht mehr an das Vorhandensein der XML-Erweiterung gebunden).
* **`mail()` / `mb_send_mail()`** akzeptieren nun auch **Header-Arrays** anstelle von Strings.
* **DBA** erhält Unterstützung für das **LMDB**-Backend.
* **GD**: **`imageantialias()`** mit System-libgd; **`imagegd()`** speichert Truecolor-Bilder originalgetreuer.
* **`session_module_name('user')`** löst nun einen **behebbaren Fehler** aus, anstatt stillschweigend fehlzuschlagen.

---

<a id="practical-recipes"></a>
## Praktische Rezepte

### Absicherung von `count()`

```php
// src/recipes.php
if (is_array($x) || $x instanceof \Countable) {
    $n = count($x);
}
```

(`is_countable()` wird erst in PHP 7.3 eingeführt – unter 7.2 verwenden Sie diesen expliziten Check.)

### Sicheres `get_class()`

```php
// src/recipes.php
$cls = is_object($obj) ? get_class($obj) : self::class;
```

---

<a id="common-mistakes"></a>
## ⚠️ Häufige Fehler

Hier sind typische Stolpersteine in PHP 7.2:

### 1. Zählen von nicht-zählbaren Variablen
Der Aufruf von `count()` auf `null`, Booleans, Integern oder Standardobjekten löst nun eine Warnung aus.
```php
// src/BadCount.php
// Schlecht: Null ist nicht zählbar, löst aus: Warning: count(): Parameter must be an array or an object that implements Countable
$data = null;
echo count($data); 
```
```php
// src/GoodCount.php
// Gut: Prüfen Sie vor dem Zählen, ob die Variable zählbar ist
$data = null;
echo (is_array($data) || $data instanceof \Countable) ? count($data) : 0;
```

### 2. Übergabe von `null` an `get_class()`
In früheren Versionen gab `get_class(null)` den Namen der Klasse zurück, aus der die Funktion aufgerufen wurde. In PHP 7.2 wird ein E_WARNING ausgegeben.
```php
// src/BadGetClass.php
// Schlecht: Löst ein E_WARNING aus, wenn $obj null ist
$className = get_class($obj); 
```
```php
// src/GoodGetClass.php
// Gut: Sichern Sie den Aufruf ab oder prüfen Sie, ob die Variable ein Objekt ist
$className = is_object($obj) ? get_class($obj) : 'DefaultClass';
```

---

<a id="limitations"></a>
## Einschränkungen

* **Generischer `object`-Typ**: Sie können nicht angeben, *welche* Objektstruktur Sie erwarten; es wird lediglich validiert, dass der Wert eine Objektinstanz ist. Sie können dies nicht nutzen, um Klassen zuzulassen, aber `stdClass` dynamisch abzulehnen.
* **libsodium-Integration**: Stellt Low-Level-Kryptographie-Funktionen bereit. Obwohl sie extrem sicher sind, erfordert ihre Verwendung das Verständnis kryptographischer Konzepte (wie Nonces und Keys), um Sicherheitslücken zu vermeiden.

---

<a id="backward-incompatible"></a>
## Rückwärtskompatibilität und BC-Breaks

### Core & Typen

* **`number_format()`** gibt für ungerade Floating-Edge-Cases nicht mehr **`-0`** zurück.
* **Casting von Arrays/Objekten mit numerischen Schlüsseln**: Der Zugriff auf **`$obj->{0}`** / **`$obj->{'0'}`** und der gespiegelte **`(array)`**-Zugriff verhalten sich bei Integer-artigen Schlüsseln nun **konsistent**.
* **`get_class(null)`** erzeugt nun eine **Warnung**; lassen Sie das Argument weg oder übergeben Sie ein Objekt.
* **`count()`** (und **`sizeof()`**) auf **nicht-zählbaren** Typen wirft ein **`E_WARNING`** – Code, der sich auf `count(null) === 0` verlassen hat, bricht ab.
* **`spl_autoload_register()`**-Parität: Deprecations rund um das veraltete **`__autoload`**.

### Erweiterungen

* **MCrypt-Erweiterung aus dem Core entfernt** – installieren Sie sie bei absolutem Bedarf aus **PECL**, migrieren Sie jedoch bevorzugt auf **OpenSSL/Sodium**.

---

<a id="deprecations"></a>
## Veraltete Features (frühzeitig beheben)

Wichtige Punkte:

* **`__autoload()`** – verwenden Sie stattdessen **`spl_autoload_register()`**.
* Unquotierte Barewords, die früher als **Notice** gemeldet wurden, werfen nun ein **Warning** (Zukunft: `Error`).
* Veraltet sind nun auch das klassische **`create_function()`**, **`each()`**, String-basiertes **`assert()`**, ein-argumentiges **`parse_str()`**, der Alias **`read_exif_data()`**, **`gmp_random()`** sowie **`png2wbmp` / `jpeg2wbmp`**.

---

<a id="interactive-quiz"></a>
## Interaktives Quiz

Testen Sie Ihr Wissen über PHP 7.2:

1. **Was passiert, wenn Sie `count(null)` in PHP 7.2 ausführen?**
   * A) Es gibt stillschweigend `0` zurück.
   * B) Es wirft einen Fatal Error.
   * C) Es gibt ein `E_WARNING` aus und gibt `0` zurück.
   * D) Es gibt `false` zurück.

   <details>
   <summary>Klicken, um die Antwort anzuzeigen</summary>
   
   **Richtige Antwort: C**  
   PHP 7.2 gibt ein Warning aus: `count(): Parameter must be an array or an object that implements Countable`, gibt jedoch aus Gründen der Rückwärtskompatibilität weiterhin `0` zurück.
   </details>

2. **Welche der folgenden Aussagen trifft auf Parameter-Type-Widening in PHP 7.2 zu?**
   * A) Eine Kindklasse kann den Typ der Parameter aus ihrer Elternklasse verengen.
   * B) Eine Kindklasse kann die in der Elternklasse vorhandenen Parameter-Typ-Hints vollständig weglassen.
   * C) Es erfordert die Verwendung des Schlüsselworts `widen`.
   * D) Es ist nur auf Rückgabetypen anwendbar.

   <details>
   <summary>Klicken, um die Antwort anzuzeigen</summary>
   
   **Richtige Antwort: B**  
   Beim Parameter-Type-Widening dürfen Überschreibungen in Kindklassen Typ-Hints weglassen, die in den Methoden der Elternklasse definiert sind (wodurch der akzeptierte Eingabebereich aufgeweitet wird).
   </details>

3. **Was ist der empfohlene Ersatz für die veraltete mcrypt-Erweiterung?**
   * A) Crypt
   * B) OpenSSL oder Sodium
   * C) md5
   * D) Hash

   <details>
   <summary>Klicken, um die Antwort anzuzeigen</summary>
   
   **Richtige Antwort: B**  
   Sodium ist nun im Core von PHP 7.2 enthalten, und OpenSSL ist die Standardalternative für ältere Kryptographie, was mcrypt überflüssig macht.
   </details>

---

<a id="closing-thoughts"></a>
## Schlussgedanken

PHP 7.2 ist ein guter Zeitpunkt, um **mcrypt-Codepfade zu löschen**, nach **`count(`** auf möglicherweise leeren Werten zu suchen und **`get_class(null)`** zu korrigieren. Gehen Sie danach weiter zu 7.3+ für `JsonException`, `is_countable()` und Verbesserungen bei Heredoc.