PHP, come molti di noi sanno, ha una digitazione debole . Per coloro che non lo fanno, PHP.net dice:
PHP non richiede (o supporta) la definizione esplicita del tipo nella dichiarazione delle variabili; il tipo di una variabile è determinato dal contesto in cui viene utilizzata la variabile.
Lo adori o lo odi, PHP rilancia le variabili al volo. Quindi, il seguente codice è valido:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP ti consente anche di lanciare esplicitamente una variabile, in questo modo:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
È tutto fantastico ... ma, per la mia vita, non riesco a concepire una ragione pratica per farlo.
Non ho problemi con la digitazione forte in lingue che lo supportano, come Java. Va bene, e lo capisco perfettamente. Inoltre, sono a conoscenza di - e comprendo appieno l'utilità - suggerimenti di tipo nei parametri di funzione.
Il problema che ho con il tipo casting è spiegato dalla citazione sopra. Se PHP può scambiare i tipi a piacimento , può farlo anche dopo aver forzato il cast di un tipo; e può farlo al volo quando hai bisogno di un certo tipo in un'operazione. Ciò rende valido quanto segue:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Quindi qual è il punto?
Prendi questo esempio teorico di un mondo in cui il cast di tipi definiti dall'utente ha senso in PHP :
- Forzate la variabile di cast
$foo
comeint
→(int)$foo
. - Si tenta di memorizzare un valore di stringa nella variabile
$foo
. - PHP genera un'eccezione !! ← Questo avrebbe senso. Improvvisamente esiste la ragione per il cast di tipi definiti dall'utente!
Il fatto che PHP cambierà le cose secondo necessità rende vago il punto del cast di tipo definito dall'utente. Ad esempio, i seguenti due esempi di codice sono equivalenti:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Un anno dopo aver inizialmente posto questa domanda, indovina chi si è trovato a usare il typecasting in un ambiente pratico? Cordialmente.
Il requisito era di visualizzare i valori in denaro su un sito Web per un menu di ristorante. Il design del sito richiedeva che gli zeri finali fossero tagliati, in modo che il display fosse simile al seguente:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Il modo migliore che ho trovato per farlo è sprecare per lanciare la variabile come float:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP ritaglia gli zeri finali del float, quindi riformula il float come stringa per la concatenazione.
(string)
cast dappertutto ?
$intval.'bar'
genera un'eccezione, non sono ancora d'accordo. Ciò non costituisce un'eccezione in nessuna lingua. (Tutte le lingue che conosco eseguono un cast automatico o a .toString()
). Se stai dicendo che $intval = $stringval
genera un'eccezione, stai parlando di un linguaggio fortemente tipizzato. Non intendevo sembrare scortese, quindi scusami se l'ho fatto. Penso solo che vada contro ciò a cui ogni sviluppatore è abituato, ed è molto, molto meno conveniente.