Todo valor en PHP tiene un tipo: es texto, es un número entero, es un decimal,
es verdadero o falso, o no tiene valor. El tipo decide qué puedes hacer con él:
sumar dos números tiene sentido; sumar dos nombres, no.
Los cinco tipos simples
Tipo
Qué guarda
Ejemplos
var_dump muestra
string
Texto, entre comillas
"Ana", 'Punta Arenas', "42"
string(3) "Ana"
int
Número entero
20, -3, 0
int(20)
float
Número con decimales (con punto)
5.8, 0.19, -1.5
float(5.8)
bool
Verdadero o falso
true, false
bool(true)
null
Ausencia de valor
null
NULL
Hay dos tipos más que se ven después: el arreglo (array, una lista de valores,
en la Parte 5) y el objeto (lo que devuelve
la conexión a la base de datos, en la Unidad 3).
Incorrecto: un número entre comillas, o con coma decimal
<?php$edad = "20";$promedio = 5,8;
"20" es texto que se ve como número. 5,8 es un error de sintaxis: en
PHP la coma separa valores, no decimales.
Correcto
<?php$edad = 20;$promedio = 5.8;
PHP convierte tipos sin avisar
Si mezclas tipos en una operación, PHP convierte uno de ellos para poder
operar. Es cómodo, pero hay que saber predecirlo.
Todo lo que llega desde un formulario llega como texto. Si el usuario escribe
20 en el campo edad, PHP recibe "20". Gracias a la conversión automática,
"20" + 1 da 21; pero para validar que realmente sea un número tendrás que
revisarlo tú.
PHP Warning: A non-numeric value encountered in /home/ana/prueba.php on line 26PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /home/ana/prueba.php:4
Si el texto empieza con un número, PHP usa ese número y avisa con un Warning.
Si no tiene ningún número al inicio, es un Fatal error.
Convertir a mano
Para convertir un valor a un tipo, se escribe el tipo entre paréntesis antes del
valor. Se llama casting.
¿Es un número, o un texto que se puede leer como número?
12, "12", "5.8"
is_int($x)
¿Es de tipo entero?
12 (pero no "12")
is_float($x)
¿Es de tipo decimal?
5.8
is_string($x)
¿Es texto?
"Ana", "12"
is_bool($x)
¿Es true o false?
false
is_null($x)
¿Es null?
null
Valores que cuentan como falso
En una condición, PHP convierte cualquier valor a bool. Estos siete valores se
convierten en false; todo lo demás es true.
Valor
Tipo
¿Cuenta como falso?
false
bool
Sí
0
int
Sí
0.0
float
Sí
""
string vacío
Sí
"0"
string
Sí (la trampa)
null
null
Sí
[]
arreglo vacío
Sí
" "
string con un espacio
No
"0.0"
string
No
"false"
string
No: es un texto con cinco letras
Incorrecto: tratar "0" como si no hubiera dato
Si alguien escribe 0 en un campo “cantidad de hijos”, PHP recibe "0", y
"0" cuenta como falso. Un if ($hijos) lo trataría como si el campo estuviera
vacío. Este caso vuelve en
Validar en el servidor.
Pasa en todos los lenguajes (también en C): los decimales se guardan en binario y
algunos no tienen representación exacta. Para mostrarlos se redondean
(round(0.1 + 0.2, 2) da 0.3), y los precios en pesos se guardan como enteros.
Pruébalo
Haz var_dump de "5" + 3 y de "5" . 3, y explica la diferencia antes de ejecutar
Convierte "12", "12.7" y "doce" a int y mira qué da cada uno
Revisa con is_numeric() los mismos tres valores
Error provocado: escribe $promedio = 5,8; y lee el error
Error provocado: suma "hola" + 1 y lee el tipo de error
Errores comunes
Síntoma
Causa
Solución
syntax error, unexpected token ","
Escribiste un decimal con coma: 5,8
Usa punto: 5.8
Un número se pega a otro ("53" en vez de 8)
Usaste . en vez de +
. une texto, + suma
A non-numeric value encountered
Operaste con un texto que no es solo número
Revisa con is_numeric() antes de operar
Unsupported operand types: string + int
Operaste con un texto que no empieza con número
Valida el dato; no conviertas a ciegas
(int) da un número menor al esperado
El casting corta los decimales
Usa round()
Checkpoint
Intenta responder antes de desplegar cada pregunta.
¿Qué imprime var_dump("10" + "5"); y por qué?
int(15). El + es una operación de números, así que PHP convierte los dos
textos en enteros antes de sumar.
Un usuario escribe 0 en un formulario y tu código lo trata como campo vacío. ¿Por qué?
Porque llega como el texto "0", y "0" es uno de los valores que PHP considera
falso. Una condición como if ($dato) no distingue entre "0" y "".
¿Cuánto da (int) 4.99 y qué usarías para que dé 5?
4, porque el casting corta los decimales. Para redondear, round(4.99), que
da float(5).
¿Es lo mismo "20" que 20?
No. "20" es un string y 20 es un int. Se ven iguales con echo, pero
var_dump muestra la diferencia, y la comparación estricta "20" === 20 da
false.