Type juggling
PHP no requiere (o soporta) la declaración explícita del tipo en
la declaración de variables; el tipo de una variable se determina por el
contexto en el que se usa esa variable_ Esto quiere decir que si se
asigna un valor de cadena a la variable var,
var se convierte en una cadena_ Si después se asigna
un valor entero a la variable var, se convierte en
una variable entera_
Un ejemplo de conversión de tipo automática en PHP3 es el operador
suma '+'_ Si cualquiera de los operandos es un doble, entonces todos
los operandos se evalúan como dobles, y el resultado será un
doble_ En caso contrario, los operandos se interpretarán como enteros,
y el resultado será también un entero_ Nótese que esto NO
cambia los tipos de los operandos propiamente dichos; el único cambio
está en cómo se evalúan los operandos_
Si los últimos dos ejemplos anteriores parecen confusos, vea Conversión
de cadenas_
Si se desea obligar a que una variable sea evaluada con un tipo concreto,
mire la sección Forzado
de tipos_ Si se desea cambiar el tipo de una variable, vea la
función settype()_
Si quisiese probar cualquiera de los ejemplos de esta sección,
puede cortar y pegar los ejemplos e insertar la siguiente línea para
ver por sí mismo lo que va ocurriendo:
Nota:
La posibilidad de una conversión automática a array no está definida
actualmente_
Aunque el ejemplo anterior puede parecer que claramente debería resultar
en que $a se convierta en un array, el primer elemento del cual es 'f',
consideremos esto:
Dado que PHP soporta indexación en las cadenas vía offsets usando la
misma sintaxis que la indexación de arrays, el ejemplo anterior nos
conduce a un problema: ¿debería convertirse $a en un array cuyo primer
elemento sea "f", o debería convertirse "f" en el primer carácter de la
cadena $a?
Por esta razón, tanto en PHP 3_0_12 como en PHP 4_0b3_RC4, el resultado
de esta conversión automática se considera que no está definido_ Los
parches se están discutiendo, de todas formas_
Forzado de tipos
El forzado de tipos en PHP funciona como en C: el nombre del tipo
deseado se escribe entre paréntesis antes de la variable a la que
se pretende forzar_
Los forzados de tipo permitidos son:
(int), (integer) _ fuerza a entero (integer)
(real), (double), (float) _ fuerza a doble (double)
(string) _ fuerza a cadena (string)
(array) _ fuerza a array (array)
(object) _ fuerza a objeto (object)
Nótese que las tabulaciones y espacios se permiten dentro de los
paréntesis, así que los siguientes ejemplos son funcionalmente
equivalentes:
Puede no ser obvio que ocurrirá cuando se fuerce entre
ciertos tipos_ Por ejemplo, lo siguiente debería ser tenido
en cuenta_
Cuando se fuerza el cambio de un escalar o una variable de cadena
a un array, la variable se convertirá en el primer elemento del
array:
Cuando se fuerza el tipo de una variable escalar o de una cadena
a un objeto, la variable se convertirá en un atributo del objeto;
el nombre del atributo será 'scalar':