PHP, como la mayoría de nosotros sabemos, tiene escritura débil . Para aquellos que no lo hacen, PHP.net dice:
PHP no requiere (o admite) definición de tipo explícita en la declaración de variable; el tipo de una variable está determinado por el contexto en el que se usa la variable.
Lo amo o lo odio, PHP vuelve a lanzar las variables sobre la marcha. Por lo tanto, 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, de este modo:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Todo es genial ... pero, por mi vida, no puedo concebir una razón práctica para hacer esto.
No tengo problemas con la escritura fuerte en lenguajes compatibles, como Java. Eso está bien, y lo entiendo completamente. Además, soy consciente de y entiendo completamente la utilidad de sugerencias de tipo en los parámetros de función .
El problema que tengo con la conversión de tipos se explica mediante la cita anterior. Si PHP puede intercambiar los tipos a voluntad , puede hacerlo incluso después de que fuerce la conversión de un tipo; y puede hacerlo sobre la marcha cuando necesite un determinado tipo en una operación. Eso hace válido lo siguiente:
$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 definidos por el usuario tiene sentido en PHP :
- Forzas la variable de conversión
$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, ¡el motivo de la conversión de tipos definidos por el usuario existe!
El hecho de que PHP cambie las cosas según sea necesario hace que el punto de conversión del tipo definido por el usuario sea impreciso. 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 haber formulado originalmente esta pregunta, ¿adivina quién se encontró usando encasillamiento en un entorno práctico? Atentamente.
El requisito era mostrar los 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 pareciera a la siguiente:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
La mejor manera que encontré para hacer eso fue lanzar la variable como un flotador:
$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 ubicar el flotador como una cadena para la concatenación.