Saltar a contenido

Lab 02 — Variables, tipos y salida en PHP

Campo Valor
Módulo Implantación de Aplicaciones Web (IMW)
Ciclo Administración de Sistemas Informáticos en Red (ASIR)
Unidad UT4 — PHP en servidor
Criterios de evaluación (CE) b (relación con HTML), c (sintaxis básica)
Requisitos Lab 01 completado (entorno Apache+PHP + VirtualHost gestor.local)
Agrupación Individual
Herramientas Navegador + editor de texto + terminal
Apuntes https://ichigar.codeberg.page/imw/recursos/ut4_php_02_variables_tipos_salida/
Tiempo estimado 90–120 minutos

Antes de empezar

Qué vamos a hacer

En este lab practicamos con las variables de PHP: cómo se declaran, qué tipos existen (texto, número, booleano), cómo se combinan con operaciones y cómo se muestran en una página HTML de forma segura.

Crearemos tres ficheros pequeños en ~/gestor/public/:

  • variables.php — para practicar variables de texto y número.
  • tipos.php — para inspeccionar tipos con var_dump().
  • ficha.php — página completa que integra todo lo anterior.

Al terminar tendrás interiorizado el ciclo "declaro variable → opero con ella → la muestro escapada en HTML", que es la base de todo lo que vamos a hacer a continuación.

Paralelismo con bash

En PHP, las variables empiezan por $ y las instrucciones acaban en ;. Las asignaciones se parecen mucho a bash:

Bash PHP
titulo="Impresora sin papel" $titulo = 'Impresora sin papel';
num=7 $num = 7;
echo $titulo echo $titulo;

Diferencias importantes: en PHP sí distinguen mayúsculas ($var$Var), el ; es obligatorio, y al mostrar texto en HTML usamos htmlspecialchars() por seguridad (como ya viste en el Lab 01).

Antes de empezar: comprueba que gestor.local sigue funcionando

Desde el navegador de tu Windows, visita http://gestor.local. Debes ver la página que creaste en el Lab 01 (tu index.php personalizado).

Si el navegador dice "no se puede resolver el nombre" o similar, es que ha pasado tiempo desde el Lab 01 y algo se ha desconfigurado. Causas habituales:

  • La IP del servidor ha cambiado (DHCP): ejecuta ip a | grep "inet " en la VM para ver la IP actual y edita C:\Windows\System32\drivers\etc\hosts en tu Windows (como administrador) para ajustar la línea de gestor.local.
  • Apache no está arrancado: en el servidor, sudo systemctl start apache2.

Hasta que http://gestor.local no responda, no sigas con este lab.


Cómo se entrega este lab

Al terminar, empaqueta tu trabajo en un ZIP con esta estructura exacta:

apellido_nombre_lab02/
├── gestor/
│   └── public/
│       ├── variables.php
│       ├── tipos.php
│       ├── ficha.php
│       └── resumen.php
├── capturas/
│   ├── paso1_variables_texto.png
│   ├── paso2_variables_numeros.png
│   ├── paso3_vardump.png
│   ├── paso4_concatenacion.png
│   ├── paso5_ficha.png
│   └── paso6_resumen_taller.png
└── RESPUESTAS.md

Nombres prescritos

Los nombres de ficheros y carpetas son obligatorios y exactos. El script de corrección busca estos nombres concretos.

Cómo preparar el ZIP (Windows o Linux/macOS):

  1. Crea la carpeta apellido_nombre_lab02 en tu equipo (minúsculas, sin espacios ni acentos).
  2. Reproduce la estructura: los 4 .php los crearás en el servidor durante los pasos del lab y debes copiarlos a tu carpeta de entrega antes de hacer el ZIP. Guarda también las 6 capturas con el nombre exacto, y crea el RESPUESTAS.md (plantilla al final).
  3. Comprime:
    • Windows: clic derecho sobre la carpeta → Enviar aCarpeta comprimida (en zip).
    • Linux/macOS: zip -r apellido_nombre_lab02.zip apellido_nombre_lab02/.
  4. Verifica que al abrir el ZIP aparece una sola carpeta raíz apellido_nombre_lab02/.

Paso 1 — Variables de texto (strings)

Conceptos

  • Una variable de texto (string) guarda una cadena de caracteres.
  • Se puede escribir con comillas simples 'texto' o comillas dobles "texto". Hay una diferencia importante que veremos en el Paso 4.
  • Igual que en el Lab 01: toda variable de texto mostrada en HTML se escapa con htmlspecialchars($var) para evitar ataques XSS.
  • Solo se escapan las variables de texto: los números no pueden contener etiquetas HTML, así que no necesitan htmlspecialchars(). Lo veremos en el Paso 2.

Objetivo. Crear un primer fichero con 3 variables de texto y mostrarlas en una página HTML.

Tarea. Crea ~/gestor/public/variables.php con este contenido:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Tres variables de texto (string)
$titulo      = 'Impresora sin papel';
$descripcion = 'La impresora de la sala 201 no tiene papel.';
$prioridad   = 'alta';
?>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Variables de texto</title>
</head>
<body>
  <h1><?= htmlspecialchars($titulo) ?></h1>
  <p><?= htmlspecialchars($descripcion) ?></p>
  <p>Prioridad: <?= htmlspecialchars($prioridad) ?></p>
</body>
</html>

Visita http://gestor.local/variables.php y comprueba que aparecen los 3 textos.

Experimento: XSS en vivo. Para entender por qué usamos htmlspecialchars(), haz este pequeño experimento:

  1. Cambia temporalmente el valor de $titulo a:

    $titulo = "<script>alert('hola desde XSS')</script>";
    
  2. Quita temporalmente el htmlspecialchars() en la línea del <h1>, dejándolo así:

    <h1><?= $titulo ?></h1>
    
  3. Guarda y recarga http://gestor.local/variables.php en el navegador. Verás aparecer un popup con "hola desde XSS". El navegador ha ejecutado el código del $titulo porque no lo escapamos.

Deshaz el experimento antes de seguir

Antes de pasar al Paso 2, deja variables.php como estaba. Tienes que hacer los dos cambios, no solo uno:

1. Restaura el valor original de $titulo:

$titulo = 'Impresora sin papel';

2. Vuelve a poner htmlspecialchars() en el <h1>:

<h1><?= htmlspecialchars($titulo) ?></h1>

Guarda, recarga http://gestor.local/variables.php y comprueba que el popup ya no aparece y que se ve el texto "Impresora sin papel" en el <h1>. Si solo deshaces uno de los dos cambios el popup desaparece igualmente, pero la página sigue siendo insegura: por eso hay que deshacer los dos.

Pista si ves código PHP en la página

Si el navegador muestra literalmente <?php ... ?>, es que Apache no está interpretando el fichero. Revisa que lo has guardado con extensión .php y dentro de ~/gestor/public/.

Pista si la página sale en blanco o con HTTP ERROR 500

Si al recargar variables.php ves la pestaña completamente en blanco o un genérico HTTP ERROR 500, lo más probable es que tengas una errata de sintaxis en el PHP (un ; que falta, una comilla sin cerrar, un <?php mal escrito...) y que display_errors no esté activado en php.ini, así que PHP no te muestra el mensaje de error.

Vuelve al Paso 5 del lab A1 — Depuración: ver los errores de PHP — y comprueba que activaste display_errors = On en /etc/php/*/apache2/php.ini y recargaste Apache. Una vez hecho, recarga variables.php: en lugar de la pantalla en blanco aparecerá el mensaje de error con la línea exacta donde está el problema. No tendrás que volver a tocar php.ini para los próximos labs.

Responde en RESPUESTAS.md, sección ## Paso 1.

¿Qué ocurrió al recargar la página durante el experimento (paso con <script> y sin htmlspecialchars())? ¿Qué cambió al poner htmlspecialchars() de nuevo? Explícalo con tus palabras en dos o tres líneas.

Captura requerida. Guarda en capturas/paso1_variables_texto.png una captura del navegador con la página variables.php mostrando los 3 textos. Debe verse:

  • La URL http://gestor.local/variables.php.
  • El título "Impresora sin papel".
  • El párrafo de descripción y la prioridad "alta".

Verificación.

  • ~/gestor/public/variables.php existe y se abre desde el navegador.
  • Se ven los 3 textos del fichero.
  • Las 3 variables se muestran con htmlspecialchars().
  • He guardado capturas/paso1_variables_texto.png.

Paso 2 — Variables numéricas y operaciones

Conceptos

  • Una variable numérica guarda un número entero (int, por ejemplo 7) o decimal (float, por ejemplo 3.14).
  • No llevan comillas. Paralelismo con bash: $n = 7; en PHP es n=7 en bash.
  • Operadores aritméticos: +, -, *, /, % (resto de la división). Igual que en bash pero sin el $(( ... )) — en PHP las operaciones se escriben tal cual.
  • La función round($valor, $decimales) redondea un número a un número exacto de decimales. Por ejemplo, round(30.456, 1) da 30.5 (1 decimal) y round(30.456, 2) da 30.46 (2 decimales). Sin segundo argumento redondea al entero más cercano.

Objetivo. Ampliar variables.php para mostrar estadísticas básicas calculadas con operaciones aritméticas.

Tarea 1 — Añadir variables numéricas al bloque PHP. Abre ~/gestor/public/variables.php. Dentro del bloque PHP que ya tienes (entre <?php y ?>, justo después de la línea $prioridad = 'alta';), añade estas 4 líneas:

1
2
3
4
$abiertas  = 7;
$resueltas = 3;
$total     = $abiertas + $resueltas;
$porcentaje_resueltas = round($resueltas / $total * 100, 1);

El bloque PHP completo debe quedar así (conservando lo del Paso 1 y añadiendo lo nuevo):

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Tres variables de texto (string)
$titulo      = 'Impresora sin papel';
$descripcion = 'La impresora de la sala 201 no tiene papel.';
$prioridad   = 'alta';

// Variables numéricas y cálculos
$abiertas  = 7;
$resueltas = 3;
$total     = $abiertas + $resueltas;
$porcentaje_resueltas = round($resueltas / $total * 100, 1);
?>

Tarea 2 — Añadir la sección HTML. Más abajo en el mismo fichero, justo antes de la etiqueta </body>, añade este bloque:

1
2
3
4
5
6
7
<h2>Estadísticas</h2>
<ul>
  <li>Incidencias abiertas: <?= $abiertas ?></li>
  <li>Incidencias resueltas: <?= $resueltas ?></li>
  <li>Total: <?= $total ?></li>
  <li>Porcentaje resueltas: <?= $porcentaje_resueltas ?> %</li>
</ul>

Observa que los números no llevan htmlspecialchars(). No hace falta: un número no puede contener etiquetas HTML ni comillas. Solo aplicamos htmlspecialchars() a texto.

Guarda y recarga http://gestor.local/variables.php. Deben aparecer las estadísticas con el porcentaje calculado debajo de los textos del Paso 1.

Pista

Si el porcentaje sale 30 en vez de 30.0, es normal: PHP omite los ceros a la derecha cuando el resultado es exacto. Si quieres forzar un formato concreto, en un lab posterior verás la función number_format().

Responde en RESPUESTAS.md, sección ## Paso 2.

Cambia los valores de $abiertas y $resueltas a 5 y 5. ¿Qué porcentaje aparece? ¿Y si los pones a 0 y 10? Explica en una línea qué hace la operación $resueltas / $total * 100.

Captura requerida. Guarda en capturas/paso2_variables_numeros.png una captura con la lista de estadísticas visible. Debe verse:

  • La URL http://gestor.local/variables.php.
  • La lista con los 4 elementos (abiertas, resueltas, total, porcentaje).

Verificación.

  • variables.php tiene las 4 variables numéricas: $abiertas, $resueltas, $total, $porcentaje_resueltas.
  • $total se calcula como $abiertas + $resueltas y aparece correctamente en la página.
  • El porcentaje aparece con un decimal (usa round(..., 1)).
  • He guardado capturas/paso2_variables_numeros.png.

Paso 3 — Inspeccionar tipos con var_dump()

Conceptos

  • PHP es de tipado dinámico: no declaras el tipo de una variable, PHP lo averigua solo. Cuando algo no funciona y no sabes por qué (un número que se trata como texto, un booleano inesperado), necesitas saber qué tipo tiene una variable. Para eso existe var_dump($var), la herramienta principal de depuración en PHP. Úsala cada vez que algo no se comporte como esperas.
  • var_dump() muestra el tipo y el valor de la variable.
  • Los tipos básicos que verás:
    • string(N) → texto de N caracteres.
    • int(N) → número entero.
    • float(N) → número decimal.
    • bool(true) o bool(false) → booleano.
    • NULL → valor nulo (no hay valor).
  • La etiqueta HTML <pre> preserva espacios y saltos de línea. var_dump() genera salida con varios saltos, así que envolveremos las llamadas dentro de <pre>...</pre> para que se lean bien en el navegador.

Objetivo. Crear un fichero aparte donde inspeccionar los tipos de varias variables.

Tarea. Crea ~/gestor/public/tipos.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$titulo      = 'Impresora sin papel';
$abiertas    = 7;
$porcentaje  = 30.0;
$resuelto    = false;
$sin_asignar = null;
?>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Tipos de datos</title>
</head>
<body>
<h1>Tipos de las variables</h1>
<pre>
<?php
var_dump($titulo);
var_dump($abiertas);
var_dump($porcentaje);
var_dump($resuelto);
var_dump($sin_asignar);
?>
</pre>
</body>
</html>

Visita http://gestor.local/tipos.php. Dentro de la etiqueta <pre> verás la salida de cada var_dump().

Responde en RESPUESTAS.md, sección ## Paso 3.

Copia literalmente la línea que muestra el var_dump de $titulo, la de $abiertas y la de $resuelto. Luego, en una frase, explica qué información te da var_dump() que no te daría un simple echo.

Captura requerida. Guarda en capturas/paso3_vardump.png una captura de la página tipos.php con toda la salida de var_dump() visible. Debe verse:

  • La URL http://gestor.local/tipos.php.
  • Las 5 líneas de salida con sus tipos (string, int, float, bool, NULL).

Verificación.

  • ~/gestor/public/tipos.php existe.
  • Aparecen los 5 tipos distintos en la salida (string, int, float, bool, NULL).
  • En RESPUESTAS.md he copiado literalmente las 3 líneas pedidas de var_dump (de $titulo, $abiertas y $resuelto).
  • He guardado capturas/paso3_vardump.png.

Paso 4 — Concatenación y comillas simples vs dobles

Conceptos

  • El operador . (punto) concatena (une) cadenas en PHP. En bash es simplemente poner cadenas juntas; en PHP siempre va el ..
  • Comillas dobles e interpolación de variables:
    • Comillas simples '...' → las variables no se expanden.
    • Comillas dobles "..." → las variables se expanden.
  • Buena práctica: usa comillas simples por defecto (son marginalmente más rápidas y claras) y solo usa dobles cuando realmente necesitas expandir variables o caracteres especiales como \n.

Objetivo. Practicar las dos formas de construir una cadena a partir de variables.

Tarea. Añade al final del bloque PHP de variables.php (antes del ?> que abre el HTML) estas variables:

1
2
3
4
// Tres formas de construir la misma cadena
$etiqueta_v1 = 'Incidencia: ' . $titulo . ' (' . $prioridad . ')';
$etiqueta_v2 = "Incidencia: $titulo ($prioridad)";
$etiqueta_v3 = 'Incidencia: $titulo ($prioridad)';   // comillas simples: sin expansión

Y en el HTML, antes de </body>, añade:

<h2>Tres formas de construir la etiqueta</h2>
<ul>
  <li>v1 (concatenación con .): <?= htmlspecialchars($etiqueta_v1) ?></li>
  <li>v2 (comillas dobles): <?= htmlspecialchars($etiqueta_v2) ?></li>
  <li>v3 (comillas simples): <?= htmlspecialchars($etiqueta_v3) ?></li>
</ul>

Guarda y recarga. Fíjate en la v3: como usa comillas simples, $titulo y $prioridad no se sustituyen por su valor, sino que aparecen literalmente.

Responde en RESPUESTAS.md, sección ## Paso 4.

¿Por qué v3 muestra $titulo literal en lugar del valor de la variable? ¿Qué ventaja tiene v2 frente a v1 en este caso? ¿En qué situaciones preferirías v1?

Captura requerida. Guarda en capturas/paso4_concatenacion.png una captura con las 3 etiquetas visibles. Debe verse:

  • La URL http://gestor.local/variables.php.
  • Las 3 líneas "v1", "v2", "v3" con los resultados distintos.

Verificación.

  • variables.php tiene las 3 variables $etiqueta_v1, $etiqueta_v2, $etiqueta_v3.
  • En la página, v1 y v2 muestran el valor expandido; v3 muestra los $ literales.
  • He guardado capturas/paso4_concatenacion.png.

Paso 5 — Página completa: ficha de una incidencia

Conceptos

  • En este paso juntas todo lo visto: declaras variables de distintos tipos, las operas, las concatenas y las muestras en una página HTML bien estructurada.
  • Cada variable de texto se escapa con htmlspecialchars() al imprimirla. Los números van sin escape (no pueden contener HTML malicioso).

Objetivo. Crear una página ficha.php que muestre una ficha completa de una incidencia con variables de texto, numéricas y al menos una variable construida por concatenación.

Tarea. Crea ~/gestor/public/ficha.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Datos de la incidencia (todo en variables)
$id            = 'inc001';
$titulo        = 'Impresora sin papel';
$descripcion   = 'La impresora de la sala 201 lleva tres días sin papel.';
$prioridad     = 'alta';
$estado        = 'pendiente';
$fecha         = '2026-04-22';
$horas_estim   = 0.5;
$autor         = 'Ana López';

$cabecera = "[$prioridad] $titulo";
?>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Ficha de incidencia <?= htmlspecialchars($id) ?></title>
</head>
<body>
  <h1><?= htmlspecialchars($cabecera) ?></h1>

  <dl>
    <dt>Identificador</dt>
    <dd><?= htmlspecialchars($id) ?></dd>

    <dt>Descripción</dt>
    <dd><?= htmlspecialchars($descripcion) ?></dd>

    <dt>Estado</dt>
    <dd><?= htmlspecialchars($estado) ?></dd>

    <dt>Prioridad</dt>
    <dd><?= htmlspecialchars($prioridad) ?></dd>

    <dt>Fecha</dt>
    <dd><?= htmlspecialchars($fecha) ?></dd>

    <dt>Horas estimadas</dt>
    <dd><?= $horas_estim ?></dd>

    <dt>Registrado por</dt>
    <dd><?= htmlspecialchars($autor) ?></dd>
  </dl>
</body>
</html>

Visita http://gestor.local/ficha.php. Personaliza al menos 3 valores (pon una incidencia tuya inventada, cambia el autor a tu nombre real, etc.).

Sobre <dl>, <dt>, <dd>

<dl> es una "lista de definición" HTML: cada par <dt> (término) + <dd> (definición) forma una entrada. Es la etiqueta semánticamente correcta para mostrar fichas con pares campo/valor.

Responde en RESPUESTAS.md, sección ## Paso 5.

Lista cuántas variables has declarado en ficha.php. ¿Cuáles van escapadas con htmlspecialchars() y cuáles no? ¿Por qué?

Captura requerida. Guarda en capturas/paso5_ficha.png una captura del navegador mostrando tu ficha personalizada. Debe verse:

  • La URL http://gestor.local/ficha.php.
  • La cabecera <h1> con el formato [prioridad] título.
  • Las 7 filas de la <dl> (Identificador, Descripción, Estado, Prioridad, Fecha, Horas estimadas, Registrado por) con sus valores.
  • Al menos 3 valores modificados respecto al ejemplo del enunciado (por ejemplo: tu nombre real como $autor en lugar de "Ana López", otro título inventado, otra fecha).

Verificación.

  • ~/gestor/public/ficha.php existe y carga desde el navegador.
  • El fichero declara 9 variables en el bloque PHP ($id, $titulo, $descripcion, $prioridad, $estado, $fecha, $horas_estim, $autor, $cabecera).
  • La <dl> tiene 7 pares <dt>/<dd> visibles.
  • He personalizado al menos 3 valores respecto al ejemplo del enunciado.
  • Todas las variables de texto usan htmlspecialchars() (los números y $horas_estim sin escape).
  • He guardado capturas/paso5_ficha.png.

Paso 6 — Aplica lo aprendido: dashboard de tu taller de informática

Qué es este paso

Los cinco pasos anteriores han sido guiados: te he dado el código y tú lo has tecleado, probado y respondido. En este sexto paso no hay código de referencia. Lo que hay son requisitos, y tú aplicas lo aprendido en los pasos 1 a 5 para cumplirlos.

No te preocupes si te atascas: la pista del final te da un ejemplo numérico para orientarte.

Objetivo. Crear un fichero nuevo resumen.php donde practiques por tu cuenta los tres conceptos del lab: variables de texto, variables numéricas con operaciones, y concatenación para construir una etiqueta resumen.

Tarea. Imagina que eres el responsable de un pequeño taller de informática que repara equipos. Crea ~/gestor/public/resumen.php con los requisitos siguientes.

Esqueleto inicial del fichero

Para evitar el "miedo al folio en blanco", empieza por este esqueleto y ve rellenándolo:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Dashboard del taller: variables de texto, numéricas, calculadas y concatenación
// (declara aquí tus variables)

?>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Resumen del taller</title>
</head>
<body>
  <!-- aquí irá tu <h1> y tu <ul> -->
</body>
</html>

Requisitos obligatorios de contenido:

  1. Al menos 3 variables de texto: nombre del taller, ciudad y mes del informe (por ejemplo, 'Abril 2026').
  2. Al menos 4 variables numéricas: equipos recibidos, equipos reparados, equipos pendientes y horas totales trabajadas.
  3. Al menos 2 variables calculadas a partir de las anteriores:
    • Porcentaje de equipos reparados sobre los recibidos (usa round() con un decimal).
    • Media de horas por equipo recibido (también con round()).
  4. Una variable de tipo cadena construida con concatenación (operador . o interpolación con comillas dobles) que forme una frase tipo: "Taller 'Reparaciones Chema' — Las Palmas — Abril 2026".

Requisitos de presentación HTML:

  • Un <h1> con la frase construida por concatenación.
  • Una lista <ul> con una línea <li> por cada variable (texto, numérica y calculada).
  • Las variables de texto se muestran con htmlspecialchars(); las numéricas sin él.

Estructura HTML esperada (orientativa, los valores los pones tú):

<h1>Taller "Reparaciones Chema" — Las Palmas — Abril 2026</h1>
<ul>
  <li>Nombre del taller: ...</li>
  <li>Equipos recibidos: ...</li>
  <li>Porcentaje reparados: ... %</li>
  <!-- una línea <li> por cada variable que hayas declarado -->
</ul>

Requisitos de calidad del código:

  • error_reporting(E_ALL) y ini_set('display_errors', '1') al principio del fichero.
  • Nombra las variables con sentido (evita $a, $b, $c).
  • Añade un comentario breve al principio del bloque PHP explicando qué hace el fichero.
Pista si te atascas con los cálculos

Imagina que tu taller ha recibido 12 equipos, ha reparado 9 y ha trabajado 40 horas en total. Las variables las declararías así:

$equipos_recibidos = 12;
$equipos_reparados = 9;
$horas_trabajadas  = 40;

Y las dos variables calculadas:

$porcentaje_reparados = round($equipos_reparados / $equipos_recibidos * 100, 1);  // 75.0
$media_horas          = round($horas_trabajadas / $equipos_recibidos, 1);         // 3.3

Los operadores y funciones son los mismos que en el Paso 2: /, *, round().

Pista sobre la concatenación

Si te resulta más cómodo, usa interpolación con comillas dobles (como en el Paso 4 v2):

$titulo_resumen = "Taller '$nombre_taller' — $ciudad — $mes";

O con el operador punto:

$titulo_resumen = "Taller '" . $nombre_taller . "' — " . $ciudad . " — " . $mes;

Ambas son válidas. Elige la que te parezca más legible.

Responde en RESPUESTAS.md, sección ## Paso 6.

Lista las variables que has declarado en resumen.php (nombre de cada una y si es de texto, numérica o calculada). Indica en qué línea del fichero has usado concatenación y qué técnica has elegido (operador . o comillas dobles con interpolación). Explica en una frase por qué los números no necesitan htmlspecialchars() pero los textos .

Captura requerida. Guarda en capturas/paso6_resumen_taller.png una captura del navegador visitando http://gestor.local/resumen.php. Debe verse:

  • La URL http://gestor.local/resumen.php.
  • El <h1> con la frase del taller construida por concatenación.
  • La lista <ul> con todas las variables (texto, numéricas y calculadas) visibles.

Verificación.

  • ~/gestor/public/resumen.php existe y carga en el navegador.
  • Tiene al menos 3 variables de texto y 4 numéricas.
  • Tiene al menos 2 variables calculadas (porcentaje y media).
  • El <h1> muestra una frase construida por concatenación.
  • Las variables de texto se muestran con htmlspecialchars(); las numéricas sin él.
  • He guardado capturas/paso6_resumen_taller.png.

Checklist final de entrega

Antes de subir el ZIP al Campus:

  • He creado la carpeta apellido_nombre_lab02/ con mi apellido y nombre reales.
  • Dentro hay gestor/public/variables.php, tipos.php, ficha.php y resumen.php.
  • Dentro hay capturas/ con los 6 PNG: paso1_variables_texto.png, paso2_variables_numeros.png, paso3_vardump.png, paso4_concatenacion.png, paso5_ficha.png, paso6_resumen_taller.png.
  • Dentro hay RESPUESTAS.md con las 6 secciones (## Paso 1 a ## Paso 6) rellenas.
  • Los 4 ficheros PHP pasan php -l sin errores (en el servidor: php -l ~/gestor/public/variables.php y análogos).
  • El ZIP se llama apellido_nombre_lab02.zip y al descomprimir aparece una sola carpeta raíz.
  • He subido el ZIP al Campus antes de la fecha límite.

Anexo — Plantilla de RESPUESTAS.md

Crea RESPUESTAS.md dentro de apellido_nombre_lab02/:

# Respuestas — Lab 02 Variables, tipos y salida

**Nombre:** Apellido, Nombre
**Fecha:** YYYY-MM-DD

## Paso 1

(Tu respuesta: qué pasaría sin `htmlspecialchars()` si `$titulo` fuera `<script>alert('hola')</script>`.)

## Paso 2

(Tu respuesta: porcentajes con 5/5 y 0/10, y explicación de la operación.)

## Paso 3

(Tu respuesta: las 3 líneas literales del `var_dump` y explicación de qué aporta respecto a `echo`.)

## Paso 4

(Tu respuesta: por qué v3 no expande las variables, ventaja de v2 frente a v1, cuándo preferir v1.)

## Paso 5

(Tu respuesta: número de variables declaradas, cuáles escapas con `htmlspecialchars()` y por qué.)

## Paso 6

(Tu respuesta: lista de variables declaradas en `resumen.php` con su tipo — texto, numérica o calculada —, línea donde has usado concatenación y técnica elegida, y por qué los números no necesitan `htmlspecialchars()` pero los textos sí.)