Type hinting in PHP

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.

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]);

?>

Scritto da Donato Pirolo

Ciao, sono Donato, frontend developer con una smisurata passione per la SEO. Creo strumenti ad hoc per aiutare aziende e professionisti ad essere cercati sul web e trovare clienti.

Potrebbero interessarti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Copyright © 2023
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram