Dal blog Treehouse :
Con PHP 7 ora abbiamo aggiunto tipi scalari. In particolare: int, float, string e bool.
Aggiungendo suggerimenti di tipo scalare e consentendo requisiti rigorosi, si spera che si possano scrivere programmi PHP più corretti e autocompattanti. Ti dà anche un maggiore controllo sul tuo codice e può renderlo più facile da leggere.
Per impostazione predefinita, le dichiarazioni di tipo scalare sono non rigide, il che significa che tenteranno di modificare il tipo originale in modo che corrisponda al tipo specificato dalla dichiarazione di tipo. In altre parole, se passi una stringa che inizia con un numero in una funzione che richiede un float, prenderà il numero dall'inizio e rimuoverà tutto il resto. Passare un float in una funzione che richiede un int diventerà int (1).
Per impostazione predefinita, PHP eseguirà il cast dei valori del tipo errato nel tipo scalare previsto, se possibile. Ad esempio, una funzione a cui viene assegnato un numero intero per un parametro che prevede una stringa otterrà una variabile di tipo stringa.
Tipi rigorosi disabilitati ( valutazione ):
<?php
function AddIntAndFloat(int $a, float $b) : int
{
return $a + $b;
}
echo AddIntAndFloat(1.4, '2');
/*
* without strict typing, PHP will change float(1.4) to int(1)
* and string('2') to float(2.0) and returns int(3)
*/
È possibile abilitare la modalità rigorosa in base al file. In modalità rigorosa, verrà accettata solo una variabile del tipo esatto della dichiarazione del tipo o verrà generato un errore TypeError. L'unica eccezione a questa regola è che un intero può essere assegnato a una funzione in attesa di un float. Le chiamate di funzione all'interno di funzioni interne non saranno influenzate dalla dichiarazione strict_types.
Per abilitare la modalità rigorosa, l'istruzione declare viene utilizzata con la dichiarazione strict_types:
Tipi rigorosi abilitati ( valutazione ):
<?php declare(strict_types=1);
function AddIntAndFloat(int $a, float $b): int
{
return (string) $a + $b;
}
echo AddIntAndFloat(1.4,'2');
// Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
echo AddIntAndFloat(1,'2');
// Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given
// Integers can be passed as float-points :
echo AddIntAndFloat(1,1);
// Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned
Esempio funzionante:
<?php
declare(strict_types=1);
function AddFloats(float $a, float $b) : float
{
return $a+$b;
}
$float = AddFloats(1.5,2.0); // Returns 3.5
function AddFloatsReturnInt(float $a, float $b) : int
{
return (int) $a+$b;
}
$int = AddFloatsReturnInt($float,1.5); // Returns 5
function Say(string $message): void // As in PHP 7.2
{
echo $message;
}
Say('Hello, World!'); // Prints "Hello, World!"
function ArrayToStdClass(array $array): stdClass
{
return (object) $array;
}
$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass
function StdClassToArray(stdClass $object): array
{
return (array) $object;
}
$array = StdClassToArray($object); // Returns array
function ArrayToObject(array $array): object // As of PHP 7.2
{
return new ArrayObject($array);
}
function ObjectToArray(ArrayObject $object): array
{
return $object->getArrayCopy();
}
var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');