PHP, come molti di noi sanno, ha digitazione debole . Per quelli che non lo fanno, PHP.net dice:
PHP does not require (or support) explicit type definition in variable declaration; a variable's type is determined by the context in which the variable is used.
Lo ami o lo odi, PHP ri-calcola le variabili al volo. Quindi, il seguente codice è valido:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP ti permette anche di castare esplicitamente una variabile, in questo modo:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
È fantastico ... ma, per la vita di me, non riesco a concepire una ragione pratica per farlo.
Non ho problemi a digitare con forza in linguaggi che lo supportano, come Java. Va bene, e lo capisco perfettamente. Inoltre, sono a conoscenza - e comprendo appieno l'utilità di - tipo suggerimento nei parametri di funzione .
Il problema che ho con il casting di tipo è spiegato dalla citazione sopra. Se PHP può scambiare i tipi at-will , può farlo anche dopo aver forzare il cast un tipo; e può farlo on-the-fly quando è necessario un determinato 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 tipo di definizione definita dall'utente ha senso in PHP :
- Forza la variabile cast
$foo
comeint
→(int)$foo
. - Si tenta di memorizzare un valore stringa nella variabile
$foo
. - PHP lancia un'eccezione !! ← Avrebbe senso. All'improvviso esiste il motivo per il tipo di casting definito dall'utente!
Il fatto che PHP cambierà le cose in base alle necessità rende vago il punto del 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 fatto questa domanda originariamente, indovina chi si è trovato a utilizzare typecasting in un ambiente pratico? Cordiali saluti.
L'obbligo era di visualizzare i valori monetari su un sito web per un menu del ristorante. Il design del sito richiedeva di tagliare gli zeri finali, in modo che il display assomigliasse a quanto segue:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Il modo migliore che ho trovato per fare questo è sprecare il cast della variabile come float:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP taglia gli zeri finali del float e quindi ricompone il float come stringa per la concatenazione.