PHP, como la mayoría de nosotros sabemos, tiene una escritura débil . Para aquellos que no, PHP.net dice:
PHP no requiere (o admite) la definición de tipo explícito en la declaración de variable; El tipo de una variable está determinado por el contexto en el que se utiliza la variable.
Me encanta o lo odio, PHP vuelve a emitir variables sobre la marcha. Entonces, el siguiente código es válido:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP también le permite emitir explícitamente una variable, así:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Eso es genial ... pero, por mi vida, no puedo concebir una razón práctica para hacer esto.
No tengo ningún problema con la escritura fuerte en idiomas que lo admiten, como Java. Eso está bien, y lo entiendo completamente. Además, soy consciente de, y entiendo completamente la utilidad de, las sugerencias de tipo en los parámetros de la función.
El problema que tengo con la conversión de tipos se explica en la cita anterior. Si PHP puede intercambiar tipos a voluntad , puede hacerlo incluso después de forzar la conversión de un tipo; y puede hacerlo sobre la marcha cuando necesite un determinado tipo en una operación. Eso hace que lo siguiente sea válido:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
¿Entonces cuál es el punto?
Tome este ejemplo teórico de un mundo donde la conversión de tipos definida por el usuario tiene sentido en PHP :
- Fuerza la variable de lanzamiento
$foo
comoint
→(int)$foo
. - Intenta almacenar un valor de cadena en la variable
$foo
. - PHP lanza una excepción !! ← Eso tendría sentido. De repente, existe la razón para la conversión de tipos definida por el usuario.
El hecho de que PHP cambie las cosas según sea necesario hace que el punto de conversión de tipo definido por el usuario sea vago. Por ejemplo, los siguientes dos ejemplos de código son equivalentes:
// 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 año después de hacer esta pregunta originalmente, ¿adivina quién se encontró usando la conversión de texto en un entorno práctico? Atentamente.
El requisito era mostrar valores monetarios en un sitio web para un menú de restaurante. El diseño del sitio requería que se recortaran los ceros finales, de modo que la pantalla se viera como la siguiente:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
La mejor manera que encontré para hacerlo fue lanzar la variable como flotante:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP recorta los ceros finales del flotador y luego vuelve a refundir el flotador como una cadena para la concatenación.
(string)
moldes por todas partes ?
$intval.'bar'
lanza una excepción, todavía estoy en desacuerdo. Eso no arroja una excepción en ningún idioma. (Todos los idiomas que conozco realizan una transmisión automática o una .toString()
). Si está diciendo $intval = $stringval
arroja una excepción, entonces está hablando de un lenguaje fuertemente tipado. No quise sonar grosero, así que lo siento si lo hice. Simplemente creo que va en contra de lo que todos los desarrolladores están acostumbrados, y es mucho, mucho menos conveniente.