Il 23 ottobre 2026 il manuale PHP dice che declare(strict_types=1) governa le chiamate fatte dal file, non le funzioni dichiarate in quel file. Un chiamante senza la riga continua a forzare i tipi.
Il 23 ottobre 2026 declare(strict_types=1) non segue la funzione. Segue il file che la chiama. La pagina Dichiarazioni di tipo del manuale PHP, sezione «Tipizzazione strict», letta oggi in italiano, lo scrive in una nota. La lezione 4 sui tipi di questo sito non contiene quelle parole: non è questo capitolo, e non accende la modalità.
In breve: senza la dichiarazione, PHP forza il valore nel tipo scalare atteso, se può. Un intero passato a un parametro stringa diventa stringa. Con la modalità strict, nel file che chiama, serve il tipo esatto, altrimenti arriva un TypeError. Eccezione scritta in pagina: un int è accettato dove è dichiarato un float. Se il file della funzione è strict e il file che chiama non lo è, vince il chiamante, e il valore viene forzato.
Cosa trovi in questo articolo
La nota sul chiamante
Il manuale, in quella sezione, dice che per impostazione predefinita PHP costringe i valori del tipo sbagliato nella dichiarazione scalare prevista, se è possibile. L’esempio è esplicito: una funzione che riceve un int per un parametro che prevede una stringa ottiene una variabile di tipo stringa. La modalità strict si abilita per file, con declare(strict_types=1). In quella modalità è accettato solo un valore che corrisponde esattamente al tipo, altrimenti viene lanciato un TypeError. L’unica eccezione scritta lì è l’int che passa un float.
La nota, subito sotto, sposta il punto in cui si guarda. La tipizzazione strict si applica alle chiamate fatte dentro il file che ha la dichiarazione, non alle funzioni dichiarate in quel file. Se un file senza strict chiama una funzione definita in un file con strict, «la preferenza del chiamante (tipizzazione coercitiva) verrà rispettata e il valore verrà forzato». Mettere declare(strict_types=1) in cima alla libreria non rende strict i siti che la includono e che non hanno la stessa riga.
Chi decide, file per file
| File che chiama | File in cui la funzione è dichiarata | Cosa scrive il manuale |
|---|---|---|
Senza strict_types | Con strict_types | Vince il chiamante. Il valore, se si può, viene forzato. |
Con strict_types | Senza | La modalità riguarda le chiamate fatte dentro il file strict. Il manuale non dice che la funzione «eredita» il lassismo del file in cui è scritta. |
Con strict_types, argomento int | Parametro float | L’int è l’eccezione: passa, anche in modalità strict. |
Con strict_types, tipo diverso e non convertibile in quell’eccezione | Qualsiasi | TypeError, se la chiamata parte dal file strict. |
La seconda riga non è una licenza che ho misurato con un interprete il 23 ottobre. È il confine della frase letta: la strict si applica alle chiamate uscite dal file che la dichiara. Non ho eseguito PHP per produrre un trace. L’avviso nella stessa sezione aggiunge un buco: le chiamate di funzione dall’interno delle funzioni interne non sono influenzate da strict_types. Una funzione interna non è il file del programmatore.
Cosa la stessa pagina non copre
Un’altra nota dice che la tipizzazione strict è definita solo per le dichiarazioni di tipo scalare. Non ne ricavo un comportamento per oggetti, array o nullable: quella frase li lascia fuori dal capitolo che ho letto. Non ho aperto, oggi, la pagina di declare per dire se la riga debba essere la prima istruzione del file. Se serve quel vincolo, sta altrove. Non lo invento qui.
La lezione 4 di questo sito introduce variabili e tipi. Riletta come pagina pubblicata, non contiene strict_types né declare. Tenerla come «capitolo sulla strict» è un errore di indice. Il TypeError della modalità strict non è nemmeno un JSON mode e non è uno schema: sono altri argomenti, e non servono per leggere questa nota.
Errori da evitare
Dichiarare
strict_types=1solo nel file della funzione e credere che ogni chiamante sia diventato strict. La nota dice il contrario.Aspettarsi un TypeError quando un int entra in un float, nel file strict. Il manuale scrive che quell’int passa.
Trattare la coercizione di default come un cast che riesce sempre. La pagina dice «se possibile». Non elenca oggi ogni coppia che fallisce.
Applicare la strict alle funzioni interne. L’avviso dice che quelle chiamate non ne sono influenzate.
Cercare la regola nella lezione 4. Lì la parola non c’è. La fonte è la sezione del manuale citata sopra.
In sintesi
Il 23 ottobre 2026 il manuale PHP in italiano dice che declare(strict_types=1) è per file e governa le chiamate fatte da quel file, non le funzioni che quel file definisce. Senza la riga, uno scalare del tipo sbagliato viene forzato se PHP può. Con la riga, il tipo deve corrispondere, salvo l’int accettato come float, altrimenti TypeError. Un chiamante senza strict continua a forzare anche se la funzione vive in un file strict. Le funzioni interne restano fuori. Non ho eseguito l’interprete e non ho letto, oggi, le regole di posizione di declare.
Foto di copertina: LPfi, terminale Decwriter, Wikimedia Commons, CC BY-SA 3.0. È una telescrivente, non un file PHP e non una dichiarazione di tipo.