---
title: 'PHP 7.2 from 7.1: object Type, Widening, Libsodium & Migration | DevSense'
description: "Guida all'aggiornamento di PHP 7.2: indicatore di tipo object, ampliamento del tipo di parametro (widening), debug dump in PDO, LDAP EXOP, API sockets addrinfo, libsodium—oltre alle modifiche BC (count, get_class, cast object/array) e alla rimozione di mcrypt."
faq:
    - { question: "Cos'è il nuovo type hint 'object' in PHP 7.2?", answer: "PHP 7.2 introduce un type hint generico 'object' per i parametri delle funzioni e i tipi di ritorno, consentendo di passare o restituire qualsiasi istanza di oggetto." }
    - { question: "Cos'è l'ampliamento del tipo di parametro (parameter type widening)?", answer: "Consente al metodo di una sottoclasse di omettere i type hint sui parametri definiti nel metodo della classe madre o dell'interfaccia, in linea con la contravarianza del principio di sostituzione di Liskov (LSP)." }
    - { question: "Come cambia la funzione 'count()' in PHP 7.2?", answer: "Chiamare 'count()' su tipi non conteggiabili (come null, interi, booleani o classi che non implementano Countable) genera ora un errore di tipo E_WARNING." }
    - { question: "Cosa è successo all'estensione mcrypt in PHP 7.2?", answer: "L'estensione mcrypt è stata completamente rimossa dal core di PHP e spostata in PECL. Gli sviluppatori sono invitati a migrare a OpenSSL o alla nuova estensione Sodium integrata nel core." }
published: '2026-05-31'
---
# PHP 7.2: Funzionalità principali

E se il controllo della lunghezza di una variabile inondasse improvvisamente i log degli errori di avvisi? PHP 7.2 introduce una rigorosa gestione degli avvisi di count, portando alla luce migliaia di bug latenti in cui gli sviluppatori chiamavano `count()` su tipi non conteggiabili come null o booleani. Ottimizza lo sviluppo quotidiano con il type hint generico `object`, l'ampliamento del tipo di parametro, l'integrazione di primo livello di libsodium e una rigorosa gestione dei warning per la funzione count.

## Indice
* [Tipo `object`](#object-type)
* [Ampliamento del tipo di parametro (Parameter type widening)](#type-widening)
* [PDO: `debugDumpParams()` più ricco](#pdo-debug)
* [Operazioni estese LDAP (EXOP)](#ldap-exop)
* [Sockets: `socket_addrinfo_*`](#sockets-addrinfo)
* [Sodium (libsodium) nel core](#sodium)
* [Estensioni importanti e stdlib](#extensions-stdlib)
* [Ricette pratiche](#practical-recipes)
* [Errori comuni](#common-mistakes)
* [Limitazioni](#limitations)
* [Modifiche non retrocompatibili](#backward-incompatible)
* [Funzionalità deprecate (da correggere presto)](#deprecations)
* [Altre modifiche e build](#other-changes)
* [Quiz interattivo](#interactive-quiz)
* [Considerazioni finali](#closing-thoughts)

---

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

È possibile dichiarare **`object`** per i parametri e per i tipi di ritorno: qualsiasi istanza di oggetto soddisfa questo requisito. Questo si abbina alle regole di covarianza del tipo di ritorno e contravarianza dei parametri introdotte con l'evoluzione di PHP 7.x.

```php
// src/ObjectHandler.php
function acceptsAnyObject(object $x): void 
{
    // Esegui operazioni con l'oggetto
}
```

> [!NOTE]
> Lo sapevi? Prima di PHP 7.2 non era possibile usare oggetti generici come type hint. Gli sviluppatori dovevano affidarsi alle annotazioni PHPDoc o verificare manualmente con `is_object()`.

---

<a id="type-widening"></a>
## Ampliamento del tipo di parametro (Parameter type widening)

Le implementazioni possono **omettere i type hint sui parametri** definiti nel metodo della classe madre o dell'interfaccia (il che rimane sicuro rispetto alla contravarianza). **Non** è possibile restringere il tipo o modificarlo con un tipo non correlato nelle catene di classi astratte/interfacce: PHP rifiuterà le sovrascritture incompatibili.

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

class MyLogger implements Logger {
    // Il tipo di parametro viene omesso (ampliato), il che è valido in PHP 7.2
    public function log($msg) {
        echo $msg;
    }
}
```

> [!NOTE]
> Lo sapevi? L'ampliamento del tipo di parametro consente alle librerie di aggiornare le proprie interfacce senza interrompere immediatamente le implementazioni di terze parti, poiché le sottoclassi possono omettere il type hint.

---

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

`PDOStatement::debugDumpParams()` consente di visualizzare il **SQL completo** inviato al server per i **prepare emulati**, inclusi i valori associati: utile per il debug della query costruita (solo quando l'emulazione è attiva).

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

---

<a id="ldap-exop"></a>
## Operazioni estese LDAP (EXOP)

Nuove funzioni di supporto come **`ldap_exop()`**, **`ldap_exop_passwd()`**, **`ldap_exop_whoami()`**, **`ldap_parse_exop()`** e costanti come **`LDAP_EXOP_START_TLS`** per gestire i flussi EXOP più comuni senza codice LDAP a basso livello.

---

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

Le funzioni **`socket_addrinfo_lookup()`**, **`socket_addrinfo_connect()`**, **`socket_addrinfo_bind()`**, **`socket_addrinfo_explain()`** incapsulano la risoluzione dei nomi e la connessione in stile **`getaddrinfo()`**. È preferibile utilizzarle al posto del parsing manuale di `AF_INET` quando sono richieste famiglie di indirizzi moderne.

---

<a id="sodium"></a>
## Sodium (libsodium) nel core

L'estensione **Sodium** è inclusa a partire da PHP 7.2 e offre le primitive AEAD, di hashing e KDF di libsodium. Deve essere considerata la scelta predefinita per la **nuova crittografia** al posto di **mcrypt** (che è stata rimossa dal core—vedi sotto).

```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>
## Estensioni importanti e stdlib

* **`utf8_encode()` / `utf8_decode()`** spostate nelle **funzioni di stringa del core** (non dipendono più dalla presenza dell'estensione XML).
* **`mail()` / `mb_send_mail()`** accettano **array di intestazioni** oltre alle stringhe.
* **DBA** introduce il supporto al backend **LMDB**.
* **GD**: la funzione **`imageantialias()`** supporta la libgd di sistema; **`imagegd()`** memorizza le immagini truecolor con maggiore fedeltà.
* **`session_module_name('user')`** ora genera un **errore recuperabile** invece di fallire silenziosamente.

---

<a id="practical-recipes"></a>
## Ricette pratiche

### Protezione su `count()`

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

(`is_countable()` sarà introdotta in PHP 7.3—in PHP 7.2 occorre utilizzare il controllo esplicito indicato sopra.)

### `get_class()` sicuro

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

---

<a id="common-mistakes"></a>
## ⚠️ Errori comuni

Ecco le tipiche insidie in PHP 7.2:

### 1. Conteggio di variabili non conteggiabili
La chiamata di `count()` su `null`, booleani, interi o oggetti standard ora genera un Warning.
```php
// src/BadCount.php
// Errato: Null non è conteggiabile, genera Warning: count(): Parameter must be an array or an object that implements Countable
$data = null;
echo count($data); 
```
```php
// src/GoodCount.php
// Corretto: verifica che la variabile sia conteggiabile prima di procedere al conteggio
$data = null;
echo (is_array($data) || $data instanceof \Countable) ? count($data) : 0;
```

### 2. Passaggio di `null` a `get_class()`
Nelle versioni precedenti, `get_class(null)` restituiva il nome della classe da cui veniva effettuata la chiamata. In PHP 7.2 genera un E_WARNING.
```php
// src/BadGetClass.php
// Errato: genera un E_WARNING se $obj è null
$className = get_class($obj); 
```
```php
// src/GoodGetClass.php
// Corretto: proteggi la chiamata o controlla se la variabile è effettivamente un oggetto
$className = is_object($obj) ? get_class($obj) : 'DefaultClass';
```

---

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

* **Type hint generico `object`**: non consente di specificare *quale* struttura di oggetto ci si aspetta; verifica semplicemente che il valore sia un'istanza di un oggetto. Non può essere utilizzato per consentire classi specifiche e rifiutare `stdClass` dinamicamente.
* **Integrazione di libsodium**: espone funzioni crittografiche a basso livello. Pur essendo estremamente sicura, richiede la comprensione di concetti crittografici (come nonces e chiavi) per evitare falle di sicurezza.

---

<a id="backward-incompatible"></a>
## Modifiche non retrocompatibili

### Core e tipi

* **`number_format()`** non restituisce più **`-0`** per rari casi limite di virgola mobile.
* **Casting di array/oggetti con chiavi numeriche**: l'accesso a **`$obj->{0}`** / **`$obj->{'0'}`** e l'accesso corrispondente tramite cast a **`(array)`** è **coerente** per le chiavi di tipo intero.
* **`get_class(null)`** ora **genera un warning**; ometti l'argomento o passa un oggetto.
* **`count()`** (e **`sizeof()`**) su tipi **non conteggiabili** genera un errore di tipo **`E_WARNING`**—il codice che faceva affidamento su `count(null) === 0` smetterà di funzionare.
* **`spl_autoload_register()`**: deprecazione della funzione legacy **`__autoload`**.

### Estensioni

* **L'estensione MCrypt è stata rimossa dal core**—installala da **PECL** solo se strettamente necessario, ma è consigliabile **migrare a OpenSSL/Sodium**.

---

<a id="deprecations"></a>
## Funzionalità deprecate (da correggere presto)

Elementi critici:

* **`__autoload()`**—utilizza **`spl_autoload_register()`**.
* I bareword senza virgolette, che in precedenza generavano un **Notice**, ora emettono un **Warning** (in futuro: `Error`).
* Funzioni deprecate: la funzione legacy **`create_function()`**, **`each()`**, **`assert()`** basata su stringhe, **`parse_str()`** a singolo argomento, l'alias **`read_exif_data()`**, **`gmp_random()`** e le funzioni **`png2wbmp` / `jpeg2wbmp`**.

---

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

Metti alla prova la tua conoscenza di PHP 7.2:

1. **Cosa succede se esegui `count(null)` in PHP 7.2?**
   * A) Restituisce `0` silenziosamente.
   * B) Genera un Fatal Error.
   * C) Emette un `E_WARNING` e restituisce `0`.
   * D) Restituisce `false`.

   <details>
   <summary>Clicca per vedere la risposta</summary>
   
   **Risposta corretta: C**  
   PHP 7.2 emetterà un warning: `count(): Parameter must be an array or an object that implements Countable`, ma restituirà comunque `0` per retrocompatibilità.
   </details>

2. **Quale delle seguenti affermazioni è vera riguardo all'ampliamento del tipo di parametro in PHP 7.2?**
   * A) Una classe figlia può restringere il tipo di parametri rispetto alla classe madre.
   * B) Una classe figlia può omettere del tutto i type hint dei parametri definiti nella classe madre.
   * C) Richiede l'uso della parola chiave `widen`.
   * D) Si applica solo ai tipi di ritorno.

   <details>
   <summary>Clicca per vedere la risposta</summary>
   
   **Risposta corretta: B**  
   Con l'ampliamento del tipo di parametro, le classi figlie possono omettere i type hint definiti nei metodi delle classi madri (ampliando l'intervallo di valori accettati in ingresso).
   </details>

3. **Qual è il sostituto consigliato per l'estensione mcrypt deprecata?**
   * A) Crypt
   * B) OpenSSL o Sodium
   * C) md5
   * D) Hash

   <details>
   <summary>Clicca per vedere la risposta</summary>
   
   **Risposta corretta: B**  
   Sodium è ora integrato nel core di PHP 7.2 e OpenSSL è l'alternativa standard per le operazioni crittografiche legacy, rendendo mcrypt obsoleto.
   </details>

---

<a id="closing-thoughts"></a>
## Considerazioni finali

PHP 7.2 è il momento ideale per **rimuovere i percorsi di codice mcrypt**, controllare l'uso di **`count(`** su valori potenzialmente nulli e correggere **`get_class(null)`**. Successivamente, procedi verso PHP 7.3+ per usufruire di `JsonException`, `is_countable()` e delle migliorie a heredoc.