---
title: 'PHP 8.5: Pipe Operator, NoDiscard, URI Extension & Migration | DevSense'
description: 'Guida a PHP 8.5 da PHP 8.4: operatore pipe |>, #[NoDiscard] e cast (void), closure in espressioni costanti, estensione URI, modifiche a Opcache e PDO.'
faq:
    - { question: "Cos'è l'operatore Pipe in PHP 8.5?", answer: "L'operatore pipe (|>) consente di concatenare le operazioni passando il valore sul lato sinistro come primo argomento al callable sul lato destro, migliorando la leggibilità del codice." }
    - { question: "Cos'è l'attributo #[NoDiscard] in PHP 8.5?", answer: 'Contrassegna funzioni o metodi il cui valore restituito non deve essere ignorato. Se un chiamante scarta il valore di ritorno, gli strumenti di analisi statica (e PHP in alcune configurazioni) emetteranno un avviso.' }
    - { question: 'Quali modifiche hanno interessato Opcache in PHP 8.5?', answer: 'Opcache è ora compilato staticamente nel binario di PHP. Non è più necessario (e non si dovrebbe) caricarlo tramite la direttiva zend_extension=opcache nei file INI.' }
    - { question: 'Come funziona la costante FILTER_THROW_ON_FAILURE?', answer: "Si tratta di un nuovo flag per le funzioni di convalida dei filtri che genera un'eccezione di tipo ValueError se la convalida fallisce, invece di restituire false." }
published: '2026-05-31'
---
# PHP 8.5: Funzionalità principali e guida interattiva

PHP 8.5 è una release di rilievo focalizzata sull'espressività sintattica e sul consolidamento della piattaforma principale. Introduce il tanto richiesto **operatore Pipe (`|>`)**, l'attributo **`#[\NoDiscard]`** per imporre la gestione del valore di ritorno delle funzioni e un'estensione nativa per l'analisi delle URL/URI allineata agli standard WHATWG.

Esploriamo queste novità con esempi pratici, esaminiamo gli errori comuni e verifichiamo la comprensione con la sezione di autovalutazione!

---

## Indice
* [L'operatore Pipe (`|>`)](#pipe-operator)
* [Closure nelle espressioni costanti](#closures-in-constants)
* [`#[\NoDiscard]` e il cast `(void)`](#nodiscard)
* [L'estensione URI nativa](#uri-extension)
* [Helper di utilità (`array_first()`, `array_last()`)](#new-functions)
* [Modifiche non retrocompatibili (PDO, Opcache)](#backward-incompatible)
* [🧠 Domande di autovalutazione](#self-check)

---

<a id="pipe-operator"></a>
## L'operatore Pipe (`|>`)

Sei stanco di annidare funzioni come `strtolower(trim($input))` o di riempire il tuo codice di variabili temporanee? PHP 8.5 introduce l'**operatore Pipe (`|>`)** che ti permette di scrivere trasformazioni sequenziali da sinistra a destra.

```php
// app/Services/Slugger.php
$slug = $title
    |> trim(...)
    |> strtolower(...)
    |> fn($s) => preg_replace('/\s+/', '-', $s);

echo $slug; // Output: hello-world
```

> [!NOTE]
> **Lo sapevi?**
> L'operatore pipe passa il valore a sinistra come **primo parametro** al callable a destra. Se hai necessità di passarlo come secondo o terzo parametro, racchiudi la chiamata in una closure o in una arrow function personalizzata.

### ⚠️ Errori comuni

**1. Dimenticare le parentesi per le arrow function**
Se colleghi delle arrow function personalizzate direttamente in una pipe, devi racchiuderle tra parentesi per evitare ambiguità nell'analisi sintattica:

```php
// app/Services/Formatter.php
// ❌ Errore di sintassi!
$result = $value |> fn($x) => $x * 2 |> fn($y) => $y + 10;

// ✅ Soluzione corretta
$result = ($value |> fn($x) => $x * 2) |> fn($y) => $y + 10;
```

---

<a id="closures-in-constants"></a>
## Closure e First-Class Callable nelle espressioni costanti

PHP 8.5 ti consente di definire **closure** e **first-class callable** in punti che prima accettavano esclusivamente valori statici, come costanti di classe, valori predefiniti delle proprietà e argomenti degli attributi.

```php
// app/Attributes/Route.php
class Route
{
    public function __construct(
        public string $path,
        public Closure $callback = (fn() => 'Default Route')
    ) {}
}
```

Questa novità è un grande vantaggio per i motori di routing e le librerie di validazione che hanno bisogno di includere logica semplice all'interno dei metadati.

---

<a id="nodiscard"></a>
## `#[\NoDiscard]` e il cast `(void)`

Quando le operazioni di scrittura o le chiamate di validazione restituiscono codici di stato, gli sviluppatori spesso dimenticano di verificarli. PHP 8.5 introduce l'attributo `#[\NoDiscard]` per emettere un avviso quando un valore di ritorno viene ignorato.

```php
// app/Services/Transaction.php
class Transaction
{
    #[\NoDiscard]
    public function commit(): bool
    {
        // ...
        return true;
    }
}

$tx = new Transaction();
$tx->commit(); // ❌ Warning: Return value of Transaction::commit() must not be discarded!
```

Se sei consapevole dell'operazione e vuoi scartare deliberatamente il valore, utilizza il nuovo cast `(void)` per sopprimere l'avviso:

```php
// app/Services/Handler.php
(void) $tx->commit(); // ✅ Scartato esplicitamente, nessun avviso emesso!
```

---

<a id="uri-extension"></a>
## L'estensione URI nativa (RFC 3986)

Le URL e le URI sono storicamente difficili da analizzare correttamente a causa di falle di sicurezza come il path traversal. PHP 8.5 include un'estensione `uri` sempre abilitata che implementa un'analisi conforme alle specifiche RFC 3986 e allo standard URL di WHATWG.

```php
// app/Services/UrlParser.php
$uri = Uri\parse('https://user:pass@example.com:8080/path?query=1#hash');

echo $uri->host;     // example.com
echo $uri->port;     // 8080
echo $uri->userInfo; // user:pass
```

---

<a id="new-functions"></a>
## Nuovi helper di utilità: `array_first()` e `array_last()`

Invece di reimpostare i puntatori degli array o scrivere funzioni ad hoc, PHP 8.5 introduce helper nativi e altamente performanti:

```php
// app/Services/Collection.php
$list = ['apple', 'banana', 'cherry'];

$first = array_first($list); // 'apple'
$last  = array_last($list);  // 'cherry'
```

Inoltre, il flag `FILTER_THROW_ON_FAILURE` può ora essere passato ai filtri di convalida per fare in modo che generino eccezioni anziché restituire `false` in caso di errore:

```php
// app/Http/Request.php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, FILTER_THROW_ON_FAILURE);
```

---

<a id="backward-incompatible"></a>
## Modifiche non retrocompatibili (check-list per l'aggiornamento)

Prima di aggiornare a PHP 8.5, verifica queste importanti modifiche:

1. **Opcache è compilato staticamente**
   Opcache fa ora parte integrante del binario PHP e non può essere compilato come estensione condivisa. L'aggiunta di `zend_extension=opcache.so` nei tuoi file INI genererà un avviso.
2. **Modifiche numeriche alle costanti PDO Fetch**
   Se memorizzi i valori interi delle modalità di recupero PDO (es. `PDO::FETCH_GROUP`) in tabelle di database o configurazioni dinamiche, fai attenzione: i loro valori interi sottostanti sono cambiati in PHP 8.5.
3. **Restrizione su `class_alias()`**
   Non è più possibile utilizzare `"array"` o `"callable"` come nomi per gli alias.

---

<a id="self-check"></a>
## 🧠 Domande di autovalutazione

Mettiamo alla prova la tua comprensione di PHP 8.5:
1. **Vero o Falso?** Il lato destro dell'operatore pipe (`|>`) può accettare argomenti multipli per impostazione predefinita.
2. Qual è la sintassi per sopprimere esplicitamente un avviso per un metodo contrassegnato con `#[\NoDiscard]`?
3. Come si dovrebbe caricare Opcache nel file `php.ini` a partire da PHP 8.5?
4. **Vero o Falso?** `array_first()` e `array_last()` funzionano anche su array associativi.

<details>
<summary><b>Mostra risposte</b></summary>

1. **Falso.** Il lato destro deve accettare esattamente un argomento. Se la funzione di destinazione accetta più parametri, devi racchiuderla in una closure o arrow function.
2. Anteponi alla chiamata un cast `(void)` (es. `(void) $obj->method();`).
3. Non occorre caricarlo affatto! È compilato staticamente nel binario. Devi soltanto abilitarlo tramite `opcache.enable=1`.
4. **Vero.** Restituiscono il primo e l'ultimo elemento di qualsiasi array, indipendentemente dal fatto che le chiavi siano numeriche o associative.
</details>