---
title: 'PHP 7.2 from 7.1: object Type, Widening, Libsodium & Migration | DevSense'
description: 'Guide de mise à niveau PHP 7.2 : indicateur de type object, élargissement du type de paramètre, dumps de débogage PDO, LDAP EXOP, API sockets addrinfo, libsodium—plus BC-breaks (count, get_class, transtypages object/array) et mcrypt déplacé vers PECL.'
faq:
    - { question: "Quel est le nouvel indicateur de type 'object' dans PHP 7.2 ?", answer: "PHP 7.2 introduit un indicateur de type générique 'object' pour les paramètres de fonction et les types de retour, permettant de passer ou de retourner n'importe quelle instance d'objet." }
    - { question: "Qu'est-ce que l'élargissement du type de paramètre (parameter type widening) ?", answer: "L'élargissement du type de paramètre permet à une méthode de sous-classe d'omettre les indicateurs de type sur ses paramètres qui sont présents dans la méthode de la classe parente ou de l'interface, s'alignant sur la contravariance du principe de substitution de Liskov (LSP)." }
    - { question: "Comment la fonction 'count()' change-t-elle dans PHP 7.2 ?", answer: "L'appel de 'count()' sur des types non dénombrables (comme null, des entiers, des booléens ou des classes n'implémentant pas Countable) génère désormais un avertissement de type E_WARNING." }
    - { question: "Qu'est-il arrivé à l'extension mcrypt dans PHP 7.2 ?", answer: "L'extension mcrypt a été complètement retirée du noyau PHP et déplacée vers PECL. Les développeurs sont encouragés à migrer vers OpenSSL ou vers la nouvelle extension Sodium intégrée d'office." }
published: '2026-05-31'
---
# PHP 7.2 : Fonctionnalités majeures

Et si la simple vérification de la taille d'une variable inondait soudainement vos journaux d'erreurs d'avertissements ? PHP 7.2 introduit une hygiène stricte des avertissements liés à count, exposant des milliers de bogues latents où les développeurs appelaient `count()` sur des types non dénombrables comme null ou boolean. Il resserre le développement quotidien avec l'indicateur de type générique `object`, l'élargissement du type de paramètre, l'intégration de premier ordre de libsodium et une hygiène stricte sur les alertes de count.

## Table des matières
* [Type `object`](#object-type)
* [Élargissement du type de paramètre (Type widening)](#type-widening)
* [PDO : un `debugDumpParams()` plus riche](#pdo-debug)
* [Opérations étendues LDAP (EXOP)](#ldap-exop)
* [Sockets : `socket_addrinfo_*`](#sockets-addrinfo)
* [Sodium (libsodium) dans le noyau](#sodium)
* [Extensions notables & stdlib](#extensions-stdlib)
* [Recettes pratiques](#practical-recipes)
* [Erreurs courantes](#common-mistakes)
* [Limitations](#limitations)
* [Changements non rétrocompatibles](#backward-incompatible)
* [Dépréciations (à corriger tôt)](#deprecations)
* [Autres changements & compilation](#other-changes)
* [Quiz interactif](#interactive-quiz)
* [Réflexions finales](#closing-thoughts)

---

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

Vous pouvez déclarer **`object`** pour les paramètres et les types de retour—n'importe quelle instance d'objet convient. Cela s'associe aux règles de covariance du type de retour / contravariance des paramètres à mesure que PHP a évolué à travers les versions 7.x.

```php
// src/ObjectHandler.php
function acceptsAnyObject(object $x): void 
{
    // Faire quelque chose avec l'objet
}
```

> [!NOTE]
> Le saviez-vous ? Avant PHP 7.2, vous ne pouviez pas typer des objets génériques. Les développeurs devaient s'appuyer sur les annotations PHPDoc ou valider manuellement avec `is_object()`.

---

<a id="type-widening"></a>
## Élargissement du type de paramètre (Parameter type widening)

Les implémentations peuvent **omettre les indicateurs de type de paramètre** qui apparaissent sur la méthode parente/d'interface (ce qui reste sûr en matière de contravariance). Vous **ne pouvez pas** restreindre ou remplacer par un type non lié dans les chaînes d'abstraits/interfaces—PHP rejettera les surcharges incompatibles.

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

class MyLogger implements Logger {
    // Le type de paramètre est omis (élargi), ce qui est valide en PHP 7.2
    public function log($msg) {
        echo $msg;
    }
}
```

> [!NOTE]
> Le saviez-vous ? L'élargissement du type de paramètre permet aux bibliothèques de mettre à jour leurs interfaces sans casser immédiatement les implémentations tierces, puisque les sous-classes peuvent omettre l'indicateur de type.

---

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

`PDOStatement::debugDumpParams()` peut afficher le **SQL complet** envoyé au serveur pour les **requêtes préparées émulées**, y compris les valeurs liées—très utile lors du débogage de la construction de requêtes (uniquement lorsque l'émulation est activée).

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

---

<a id="ldap-exop"></a>
## Opérations étendues LDAP (EXOP)

Nouveaux assistants tels que **`ldap_exop()`**, **`ldap_exop_passwd()`**, **`ldap_exop_whoami()`**, **`ldap_parse_exop()`**, plus des constantes comme **`LDAP_EXOP_START_TLS`**—couvrant les flux EXOP courants sans code de liaison LDAP brut.

---

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

**`socket_addrinfo_lookup()`**, **`socket_addrinfo_connect()`**, **`socket_addrinfo_bind()`**, **`socket_addrinfo_explain()`** enveloppent la résolution et la configuration de connexion de type **`getaddrinfo()`**—préférez ceci à l'analyse manuelle de `AF_INET` lorsque vous avez besoin de familles d'adresses modernes.

---

<a id="sodium"></a>
## Sodium (libsodium) dans le noyau

L'extension **Sodium** est livrée par défaut à partir de PHP 7.2, exposant les primitives AEAD, de hachage et KDF de libsodium. Traitez-la comme la voie par défaut pour les **nouveaux chiffrements** à la place de **mcrypt** (retirée du noyau—voir ci-dessous).

```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>
## Notable extensions & stdlib

* **`utf8_encode()` / `utf8_decode()`** ont été déplacées vers les **fonctions de chaînes de caractères du noyau** (elles ne dépendent plus de l'extension XML).
* **`mail()` / `mb_send_mail()`** acceptent des **tableaux d'en-têtes** ainsi que des chaînes de caractères.
* **DBA** prend désormais en charge le moteur de stockage **LMDB**.
* **GD** : **`imageantialias()`** avec la libgd du système ; **`imagegd()`** stocke les couleurs vraies (truecolor) de manière plus fidèle.
* **`session_module_name('user')`** lève désormais une **erreur récupérable** au lieu d'échouer silencieusement.

---

<a id="practical-recipes"></a>
## Recettes pratiques

### Sécuriser `count()`

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

(`is_countable()` arrive avec PHP 7.3—sur 7.2, utilisez la vérification explicite ci-dessus.)

### Sécuriser `get_class()`

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

---

<a id="common-mistakes"></a>
## ⚠️ Erreurs courantes

Voici les pièges typiques dans PHP 7.2 :

### 1. Compter des variables non dénombrables
Appeler `count()` sur `null`, des booléens, des entiers ou des objets standards déclenche désormais un avertissement (Warning).
```php
// src/BadCount.php
// Mauvais : Null n'est pas dénombrable, déclenche Warning: count(): Parameter must be an array or an object that implements Countable
$data = null;
echo count($data); 
```
```php
// src/GoodCount.php
// Bon : Vérifiez si la variable est dénombrable avant d'appeler count
$data = null;
echo (is_array($data) || $data instanceof \Countable) ? count($data) : 0;
```

### 2. Passer `null` à `get_class()`
Dans les versions précédentes, `get_class(null)` renvoyait le nom de la classe depuis laquelle elle était appelée. Dans PHP 7.2, cela émet une E_WARNING.
```php
// src/BadGetClass.php
// Mauvais : Déclenche une E_WARNING si $obj est null
$className = get_class($obj); 
```
```php
// src/GoodGetClass.php
// Bon : Protégez l'appel en vérifiant si la variable est un objet
$className = is_object($obj) ? get_class($obj) : 'DefaultClass';
```

---

<a id="limitations"></a>
## Limitations

* **Type générique `object`** : Vous ne pouvez pas spécifier *quelle* structure d'objet vous attendez ; cela valide simplement que la valeur est une instance d'objet. Vous ne pouvez pas l'utiliser pour autoriser certaines classes tout en rejetant `stdClass` de manière dynamique.
* **Intégration de libsodium** : Expose des fonctions cryptographiques de bas niveau. Bien qu'extrêmement sûre, elle nécessite de comprendre les concepts cryptographiques (comme les nonces et les clés) pour éviter les failles de sécurité.

---

<a id="backward-incompatible"></a>
## Changements non rétrocompatibles

### Noyau & types

* **`number_format()`** ne renvoie plus **`-0`** pour certains cas limites de calculs en virgule flottante.
* **Transtypage de tableaux/objets avec des clés numériques** : l'accès à **`$obj->{0}`** / **`$obj->{'0'}`** et son équivalent via le transtypage **`(array)`** est rendu **cohérent** pour les clés de type entier.
* **`get_class(null)`** émet désormais un **avertissement (Warning)** ; omettez l'argument ou passez un objet.
* **`count()`** (et **`sizeof()`**) sur des types **non dénombrables** émet une **`E_WARNING`**—le code qui reposait sur `count(null) === 0` ne fonctionne plus.
* **`spl_autoload_register()`** : dépréciations autour de l'ancienne fonction magique **`__autoload`**.

### Extensions

* **L'extension MCrypt a été retirée du noyau**—installez-la depuis **PECL** si vous devez absolument l'utiliser, mais il est vivement conseillé de **migrer vers OpenSSL/Sodium**.

---

<a id="deprecations"></a>
## Dépréciations (à corriger tôt)

Éléments clés :

* **`__autoload()`**—utilisez **`spl_autoload_register()`**.
* Les termes non entourés de guillemets (unquoted barewords) qui généraient auparavant une **Notice** lèvent désormais un **Warning** (à terme : `Error`).
* Les fonctions obsolètes suivantes : **`create_function()`**, **`each()`**, **`assert()`** basé sur des chaînes, **`parse_str()`** à un seul argument, l'alias **`read_exif_data()`**, **`gmp_random()`**, **`png2wbmp` / `jpeg2wbmp`**.

---

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

Testez vos connaissances sur PHP 7.2 :

1. **Que se passe-t-il si vous exécutez `count(null)` en PHP 7.2 ?**
   * A) Cela retourne `0` silencieusement.
   * B) Cela lève une erreur fatale.
   * C) Cela émet une `E_WARNING` et retourne `0`.
   * D) Cela retourne `false`.

   <details>
   <summary>Cliquez pour afficher la réponse</summary>
   
   **Bonne réponse : C**  
   PHP 7.2 émettra un avertissement : `count(): Parameter must be an array or an object that implements Countable`, mais retourne tout de même `0` pour des raisons de rétrocompatibilité.
   </details>

2. **Laquelle des affirmations suivantes est vraie concernant l'élargissement du type de paramètre en PHP 7.2 ?**
   * A) Une classe fille peut restreindre le type de paramètres hérité de sa classe parente.
   * B) Une classe fille peut complètement omettre les indicateurs de type de paramètre présents dans la classe parente.
   * C) Cela nécessite l'utilisation du mot-clé `widen`.
   * D) Cela s'applique uniquement aux types de retour.

   <details>
   <summary>Cliquez pour afficher la réponse</summary>
   
   **Bonne réponse : B**  
   Sous le mécanisme d'élargissement du type de paramètre, les surcharges de classes filles sont autorisées à omettre les indicateurs de type définis dans les méthodes de la classe parente (élargissant ainsi la plage d'entrées acceptées).
   </details>

3. **Quel est le remplacement recommandé pour l'extension mcrypt obsolète ?**
   * A) Crypt
   * B) OpenSSL ou Sodium
   * C) md5
   * D) Hash

   <details>
   <summary>Cliquez pour afficher la réponse</summary>
   
   **Bonne réponse : B**  
   Sodium est désormais intégré au noyau de PHP 7.2, et OpenSSL est l'alternative standard pour le chiffrement patrimonial, rendant mcrypt obsolète.
   </details>

---

<a id="closing-thoughts"></a>
## Réflexions finales

PHP 7.2 est le moment opportun pour **supprimer les chemins de code basés sur mcrypt**, rechercher les appels à **`count(`** sur des valeurs potentiellement nulles et corriger l'utilisation de **`get_class(null)`**. Poursuivez ensuite vers PHP 7.3+ pour bénéficier de `JsonException`, `is_countable()`, et des améliorations ergonomiques de heredoc.