Curso de PHP gratis · Capítulo 2 de 13 · con Vera Stack
Variables en PHP: tipos, var_dump, isset y constantes
Las variables son cajas con nombre. Aquí aprenderás a usarlas y, sobre todo, qué hace PHP por dentro: la tabla de símbolos, los zvals y por qué $b = $a copia el valor.
Cajas con etiqueta
Una variable es un nombre que apunta a un valor. En PHP todas empiezan por $:
$bateria = 100;
Léelo como "guarda 100 en $bateria". El = NO significa "es igual": significa asignar. Por eso $bateria = $bateria - 1; tiene sentido: calcula el valor de la derecha y lo guarda en la izquierda.
Reglas para los nombres:
- Empiezan por
$seguido de una letra o_. Luego letras, números o_. - Distinguen mayúsculas:
$Totaly$totalson variables distintas. (Curioso: las funciones y las palabras clave NO distinguen mayúsculas, pero las variables SÍ.) - Elige nombres que expliquen qué guardan:
$henomejor que$h.
<?php
$dron = "BIT-8";
$bateria = 100;
echo $dron, " tiene ", $bateria, "% de batería\n";
$bateria = 75; // reasignar: cambia el valor
$bateria = $bateria - 5;
echo "Ahora: ", $bateria, "%\n";BIT-8 tiene 100% de batería Ahora: 70%
La tabla de símbolos
¿Qué pasa realmente dentro de PHP? Cada ámbito (el programa principal, cada función...) tiene una tabla de símbolos: una lista de nombre → caja.
Cada caja es un zval (Zend value): guarda el tipo del dato y el valor.
Cuando haces $b = $a; PHP copia el valor de la caja de $a en la caja de $b. Son dos cajas independientes: cambiar una no afecta a la otra.
Pulsa Lupa Zend en el ejemplo: verás la tabla de símbolos y podrás avanzar paso a paso, línea a línea, viendo cómo cambian las cajas.
Esta idea (nombre → caja con tipo y valor) es la base para entender todo lo que viene: por qué los arrays se copian, qué es una referencia (&) y por qué los objetos se comportan distinto. Guárdala bien.
<?php
$a = 5;
$b = $a; // copia el VALOR 5 en otra caja
$b = 10; // solo cambia la caja de $b
echo "a vale ", $a, " y b vale ", $b, "\n";a vale 5 y b vale 10
Después de $a = 5; $b = $a; $a = 7; ¿cuánto vale $b?
- 5
- 7
- 12
- Da error
Ver respuesta
A. 5
$b = $a copió el valor 5 en la caja de $b. Cambiar después la caja de $a no afecta a $b.
Tipos de datos
Cada valor tiene un tipo. Los básicos (escalares) son:
- int: números enteros:
42,-7,0. - float: números con decimales:
3.14,-0.5,1e3(= 1000.0). - string: texto:
"hola",'BIT-8'. - bool: verdadero o falso:
true,false. - null: "ningún valor". Es lo que vale una variable vacía.
(Más adelante verás los tipos compuestos: array y object.)
var_dump() es tu mejor amiga para investigar: muestra el tipo y el valor. Fíjate en que para los strings muestra la longitud en bytes: por eso "Vera" es string(4).
gettype() devuelve el nombre del tipo. Ojo a una rareza histórica: para los float devuelve "double".
<?php
var_dump(42);
var_dump(3.14);
var_dump("Vera");
var_dump(true);
var_dump(null);
echo gettype(42), " ", gettype(3.14), " ", gettype("x"), "\n";int(42) float(3.14) string(4) "Vera" bool(true) NULL integer double string
Tipado dinámico
En PHP no declaras el tipo de una variable: la misma variable puede guardar un int y después un string. A esto se le llama tipado dinámico.
¿Por qué es posible? Porque en PHP el tipo vive en el valor (en la caja, el zval), no en el nombre. El nombre $x solo apunta a una caja, y cada vez que asignas, la caja pasa a contener un valor nuevo con su propio tipo.
Es cómodo, pero también peligroso: si no sabes qué tipo tiene una variable, pueden pasar cosas raras al operar con ella. En el capítulo 4 verás cómo PHP convierte tipos solo (type juggling), y en el 8 cómo exigir tipos concretos.
<?php
$x = 5;
var_dump($x);
$x = "cinco";
var_dump($x);
$x = 5.0;
var_dump($x);
$x = null;
var_dump($x);int(5) string(5) "cinco" float(5) NULL
¿Qué tipo tiene $precio después de $precio = 10; $precio = 10.5;?
- int
- float
- Los dos a la vez
- Error: no se puede cambiar el tipo
Ver respuesta
B. float
El tipo lo decide el valor actual. El último valor asignado es 10.5, un float.
Variables que no existen
Si lees una variable a la que nunca has dado valor, PHP muestra un Warning (Undefined variable) y usa null en su lugar. El programa sigue: un warning no es un error fatal, pero casi siempre indica un bug (normalmente, un nombre mal escrito).
isset($x)devuelvetruesi la variable existe y no esnull.unset($x)borra el nombre de la tabla de símbolos.
Los warnings aparecen en naranja en la consola. En la vida real, en un servidor de producción, los warnings suelen ir a un archivo de registro: ¡que no los veas no significa que no estén pasando!
<?php
$fruta = "manzana";
var_dump(isset($fruta));
unset($fruta);
var_dump(isset($fruta));
echo $fruta;
echo "La ejecución continúa\n";bool(true) bool(false) La ejecución continúa
Constantes
Una constante es un valor con nombre que no puede cambiar. No llevan $ y, por costumbre, se escriben en MAYÚSCULAS.
const CAPACIDAD = 50; define('NOMBRE_GRANJA', 'La Zendaida');
Úsalas para valores fijos del programa: así, si algún día cambian, solo los cambias en un sitio.
PHP trae muchas constantes predefinidas: PHP_EOL (salto de línea), PHP_INT_MAX (el mayor entero posible), M_PI... Y BIT-8 también: NORTE, HIERBA, HENO... ¡por eso no llevan $!
<?php
const CAPACIDAD = 50;
define('NOMBRE_GRANJA', "La Zendaida");
echo NOMBRE_GRANJA, " cabe ", CAPACIDAD, " sacos", PHP_EOL;
var_dump(PHP_INT_MAX);
var_dump(M_PI);La Zendaida cabe 50 sacos int(9223372036854775807) float(3.141592653589793)
Variables y BIT-8
Las funciones de BIT-8 devuelven valores que puedes guardar en variables:
pos_x()ypos_y(): la posición del dron.inventario(HENO): cuánto heno tienes (tambiénZANAHORIA,MADERA...).tam(): el tamaño del campo.
Guardar un resultado en una variable te permite usarlo varias veces sin volver a preguntar.
<?php cosechar(); $heno = inventario(HENO); $x = pos_x(); $y = pos_y(); echo "Tengo ", $heno, " de heno\n"; echo "Estoy en ", $x, ", ", $y, "\n";
¿Cuál de estos NO es un nombre de variable válido?
$_temp$cosecha2$2cosechas$Cosecha
Ver respuesta
C. $2cosechas
Después del $ tiene que ir una letra o un guion bajo, nunca un número.
Ejercicios de Variables en PHP resueltos
Intenta resolverlos antes de mirar la solución. En el juego puedes ejecutarlos y comprobarlos automáticamente.
Encargo 1. La ficha de BIT-8
Vera quiere archivar la ficha técnica de BIT-8. Cada dato debe tener el tipo correcto.
Crea estas variables:
$nombrecon el textoBIT-8$modelocon el entero8$bateriacon el decimal97.5$activocon el booleano verdadero
Y después muéstralas con var_dump(), en ese orden.
Pistas
- Los decimales llevan punto, no coma:
97.5. trueva sin comillas: con comillas sería un string.- Puedes pasar varias variables a la vez:
var_dump($a, $b);
Ver solución
<?php
$nombre = "BIT-8";
$modelo = 8;
$bateria = 97.5;
$activo = true;
var_dump($nombre, $modelo, $bateria, $activo);
Predicción 2. ¿Copia o no copia?
Vera baraja cajas a toda velocidad. ¿Sabrás seguirle la pista?
Lee el programa (no puedes ejecutarlo antes) y elige qué imprime.
<?php
$a = 10;
$b = $a;
$a = 20;
$c = $b;
$b = 30;
echo $a, " ", $b, " ", $c;20 30 1020 20 2030 30 3020 30 20
Ver solución
20 30 10
Exacto: cada asignación copia el valor en ese momento. Mira la traza paso a paso en la Lupa.
Misión del dron 3. Informe de posición
Vera necesita un informe de BIT-8 para su archivo: cuánto heno lleva y dónde está.
BIT-8 está en (1, 1). Muévelo una casilla al ESTE y una al NORTE, cosecha, y guarda en $heno tu heno (con inventario(HENO)), y en $x y $y su posición. Luego imprime exactamente:
Heno: 1 en (2, 2)
(usando las variables, no escribiendo los números a mano).
Esta misión mueve al dron BIT-8 por un campo de cultivo: juégala en PHPlay para ver tu código animado.
Pistas
$heno = inventario(HENO);guarda el resultado de la función.- Puedes pasar varios trozos a echo:
echo "Heno: ", $heno, " en (", $x, ", ", $y, ")";
Ver solución
<?php
mover(ESTE);
mover(NORTE);
cosechar();
$heno = inventario(HENO);
$x = pos_x();
$y = pos_y();
echo "Heno: ", $heno, " en (", $x, ", ", $y, ")";
Caza de bugs 4. El archivo desordenado
El ayudante de Vera escribió este programa para calcular el valor de la cosecha, pero sale mal y además con avisos.
Arregla el programa para que imprima exactamente esto y sin ningún Warning:
Cosecha: 12 Precio: 3 Total: 36
Código de partida:
<?php
$Cosecha = 12;
$precio = 3;
echo "Cosecha: ", $cosecha, "\n";
echo "Precio: ", $precio, "\n";
$total = $cosecha * $precio;
echo "Total: ", $total, "\n";
Pistas
- Lee el Warning: ¿qué variable dice que no existe?
- Las variables distinguen mayúsculas:
$Cosechay$cosechason dos variables distintas.
Ver solución
<?php
$cosecha = 12;
$precio = 3;
echo "Cosecha: ", $cosecha, "\n";
echo "Precio: ", $precio, "\n";
$total = $cosecha * $precio;
echo "Total: ", $total, "\n";
Acertijo 5. El examen del Archivo
Vera saca una ficha de su archivador: "Solo los aprendices que aprueben este examen pueden seguir".
Responde a las cinco preguntas.
¿Qué imprime
var_dump("42");?int(42)string(2) "42"42
Ver respuesta
B.
string(2) "42"¿Qué devuelve
gettype(1.5)?"float""double""decimal"
Ver respuesta
B.
"double"Tras
$x = 1; unset($x);, ¿qué devuelveisset($x)?truefalsenull
Ver respuesta
B.
false¿Qué pasa al leer una variable que no existe?
- Error fatal: se para todo
- Un Warning y se usa
null - Vale 0 sin avisar
Ver respuesta
B. Un Warning y se usa
null¿Qué línea define bien una constante?
$const MAX = 5;const MAX = 5;MAX = 5;
Ver respuesta
B.
const MAX = 5;
Chuleta: lo esencial
- Variable:
$nombre = valor;.=asigna (guarda), no compara. - Los nombres de variable distinguen mayúsculas (
$a≠$A). - Cada ámbito tiene una tabla de símbolos: nombre → caja (zval: tipo + valor).
$b = $a;copia el valor: son dos cajas independientes.- Tipos escalares: int, float, string, bool, null. El tipo vive en el valor (tipado dinámico).
var_dump($x)muestra tipo y valor;gettype($x)el nombre del tipo.- Variable inexistente → Warning +
null.isset($x)comprueba,unset($x)borra. - Constantes:
const MAX = 5;odefine('MAX', 5);. Sin$, no cambian.