Comme la plupart d’entre nous le savent, PHP est peu typé . Pour ceux qui ne le font pas, PHP.net dit:
PHP ne nécessite pas (ni ne prend en charge) la définition de type explicite dans la déclaration de variable; le type d'une variable est déterminé par le contexte dans lequel la variable est utilisée.
Qu'on l'aime ou qu'on le déteste, PHP redéfinit les variables à la volée. Donc, le code suivant est valide:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP vous permet également de convertir explicitement une variable, comme ceci:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
C'est tout cool ... mais, pour ma vie, je ne peux pas concevoir une raison pratique pour cela.
Le typage fort ne me pose pas de problème dans les langages qui le prennent en charge, comme Java. C'est bien et je le comprends tout à fait. De plus, je suis conscient de l'utilité de l'indication de type dans les paramètres de fonction et comprend parfaitement son utilité .
Le problème que j'ai avec le casting de type est expliqué par la citation ci-dessus. Si PHP peut échanger des types à volonté , il peut le faire même après avoir forcé la conversion d' un type. et il peut le faire à la volée lorsque vous avez besoin d'un certain type d'opération. Cela rend valide ce qui suit:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Alors à quoi ça sert?
Prenons cet exemple théorique d'un monde où la conversion de types définie par l'utilisateur a un sens en PHP :
- Vous forcez la variable
$foo
deint
conversion comme →(int)$foo
. - Vous essayez de stocker une valeur de chaîne dans la variable
$foo
. - PHP lève une exception !! ← Cela aurait du sens. Tout à coup, la raison du transtypage défini par l'utilisateur existe!
Le fait que PHP modifie les choses selon les besoins rend vague le sens du type défini par l'utilisateur. Par exemple, les deux exemples de code suivants sont équivalents:
// 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 an après avoir posé cette question à l'origine, devinez qui s'est retrouvé à utiliser la conversion de texte dans un environnement pratique? Votre sincèrement.
L'exigence était d'afficher des valeurs monétaires sur un site Web pour un menu de restaurant. La conception du site nécessitait que les zéros de fin soient supprimés, de sorte que l'affichage ressemble à peu près à ce qui suit:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
La meilleure façon que j'ai trouvée de le faire était de convertir la variable en float:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP élimine les zéros de fin du flottant, puis le remodèle en tant que chaîne pour la concaténation.
(string)
moulages partout ?
$intval.'bar'
jette une exception, je suis toujours en désaccord. Cela ne jette une exception dans aucune langue. (Toutes les langues que je connais effectuent une distribution automatique ou a .toString()
). Si vous dites $intval = $stringval
lève une exception, vous parlez d'un langage fortement typé. Je ne voulais pas avoir l'air impoli, alors, désolé si je l'avais fait. Je pense simplement que cela va à l’encontre de ce que chaque développeur est habitué et est beaucoup, beaucoup moins pratique.