Type hinting in PHP

Come detto, PHP è un linguaggio a tipizzazione dinamica, questo però da un lato ci aiuta con la sua estrema flessibilità, dall'altro può essere pericoloso poiché può introdurre bug o comportamenti inaspettati dell'applicazione.
A partire dalla versione 5 di PHP, è stato introdotto il concetto di type hinting che ci permette di indicare il tipo di dato che una funzione o un metodo si aspetta.
Indice
Esempio di type hinting
Se vogliamo lavorare su un tipo di dato specifico, PHP ci mette a disposizione più di una soluzione, ad esempio passando all'interno degli argomenti il tipo di dato che ci si aspetta
// Esempio con tipo di dato intero aspettato
function valoreIntero(int $parametro){
echo "Questa funzione, non ritorna Fatal error soltanto se gli vengono passati numeri interi \n";
};
valoreIntero(22); // output: Intero : 22
valoreIntero("22"); // output: Stringa convertito in Intero : 22
valoreIntero("Questa è una stringa"); // Output: Fatal error: Uncaught TypeError: valoreIntero(): Argument #1 ($parametro) must be of type int, string given
/* Se vogliamo fare in modo che anche in output ci aspettiamo un
tipo di dato possiamo mettere al di fuori delle parentesi
degli argomenti il tipo di dato che ci aspettiamo
*/
function valoreInt(int $parametro) : string {
return "test";
}
valoreInt(22);
Esempio di type hinting più restrittivo con declare(strict_types = 1)
Come abbiamo visto nell'esempio precedente il valore passato in input sottoforma di stringa "22" è stato convertito in numero intero. Se abbiamo bisogno di essere più stringenti in termini di tipi di dati che ci si aspetta, possiamo utilizzare declare(strict_types = 1);
<?php
/* Come abbiamo avuto modo di vedere nell'ultimo richiamo della funzione valoreIntero("22")
22 è stato automaticamente convertito da stringa in intero da PHP. Se vogliamo essere ancora
più restrittivi, abbiamo a disposizione un altro strumento: declare(strict_types = 1).
Usando declare(strict_type = 1) PHP non proverà a convertire il tipo di dato "22" (stringa)
in intero.
*/
declare(strict_types = 1);
function valoreIntRistretto(int $parametroX){
echo "Se non è intero è Errore";
};
// valoreIntRistretto("22"); // Argument #1 ($parametroX) must be of type int, string given,
valoreIntRistretto(22);
exit;
?>
Esempio di type hinting più restrittivo con declare(strict_types = 1)
Una volta dichiarata l'intenzione ad un controllo stretto del tipo di dato con declare(strict_types = 1) , possiamo dichiarare uno o più tipi di dati da passare in input, oppure se vogliamo con la keyword mixed possiamo specificare di far passare tutti i tipi di dati al suo interno.
<?php
declare(strict_types = 1);
// Possiamo specificare più tipi di dati da poter passare in input con pipe |
function fn1(int|float|string $p1){
};
fn1("ok");
// con mixed invece possiamo indicare di accettare qualsiasi tipo di dato.
function fn2(mixed $p1){
};
fn2("stringa");
fn2(12);
fn2(1.5);
fn2(null);
fn2([1,2,3,4,5]);
?>