UT2 · Boletín de prácticas: sintaxis básica de PHP

Este boletín reúne las prácticas de la UT2 · Sintaxis Básica de PHP. Están ordenadas de menor a mayor dificultad en tres niveles. Hazlas en orden: cada práctica usa lo que has aprendido en las anteriores.

Nivel Prácticas Qué trabajas
🟢 Básico P01 – P04 PHP dentro de HTML, echo y <?= ?>, comillas, variables, constantes y tipos
🟡 Intermedio P05 – P08 Operadores, comparaciones, conversión de tipos, funciones integradas, directivas y $_SERVER
🔴 Avanzado P09 – P10 Ámbito de las variables (global, static) y paso por referencia

Resultado de aprendizaje: RA2. Escribe sentencias ejecutables por un servidor web reconociendo y aplicando procedimientos de integración del código en lenguajes de marcas.

Requisitos comunes a todas las prácticas

  • Entorno: Herd (Windows/macOS) o Lerd (Xubuntu) con PHP 8.4.
  • Estilos: Bulma 1.x y Font Awesome por CDN. No hace falta JavaScript.
  • Sin formularios: en esta unidad los datos están escritos en el propio código. Los formularios llegan en la UT3.
  • Estructura: todo el código PHP va al principio del fichero, antes del <!DOCTYPE html>. En el HTML solo se usa <?= ?> para mostrar valores.
  • Código comentado: explica qué hace cada bloque.
  • Nombres de fichero: ut02p01.php, ut02p02.php…
  • Git: un commit por práctica terminada, con un mensaje del tipo P04: ficha de datos.

Plantillas para empezar

Descarga plantillas-ut02.zip. Tiene un fichero por práctica con el HTML y los estilos ya hechos, y comentarios TODO donde tienes que escribir el código PHP. Los valores que aparecen en la plantilla son de ejemplo: los tuyos los tiene que calcular PHP.

Descomprímelo en la carpeta de tu servidor local (Herd o Lerd).


🟢 Nivel básico

P01 · Tarjeta de perfil

RA/CE: RA2 – CE a), c), e) · Duración: 30 min

Crea una tarjeta de presentación con tus datos guardados en variables: nombre, puesto, una biografía corta y la URL de tu perfil de GitHub.

  • Muestra el nombre en un <h2> usando echo y comillas dobles, con la variable interpolada dentro de la cadena.
  • Muestra el puesto y la biografía con la etiqueta corta <?= ?>.
  • Crea el enlace al perfil con echo. Dentro de una cadena de comillas dobles tendrás que escapar las comillas del atributo: href=\"…\".
  • Abre el código fuente en el navegador (Ctrl+U) y comprueba que no queda ninguna etiqueta PHP.
Pista

echo "<a href=\"$url\">Ver perfil</a>"; y echo '<a href="' . $url . '">Ver perfil</a>'; generan el mismo HTML. ¿Cuál te parece más legible?


P02 · Estilos generados desde PHP

RA/CE: RA2 – CE c), e) · Duración: 30 min

Crea una página cuyo color cambie cada vez que la recargas. El servidor calcula los estilos y los inserta en el atributo style con <?= ?>.

  • Obtén el segundo actual con date('s') y conviértelo en un tono de color: $tono = $segundo * 6; (de 0 a 354 grados).
  • Construye dos colores con interpolación: "hsl($tono, 70%, 85%)" para el fondo y "hsl($tono, 70%, 40%)" para el borde.
  • Muestra una caja con ese fondo y ese borde, y dentro, la hora del servidor (date('H:i:s')).
  • Añade una barra de progreso cuyo width sea el porcentaje del minuto transcurrido. Redondea con round().

Recarga varias veces y compara el atributo style en el código fuente.


P03 · Comillas simples y dobles

RA/CE: RA2 – CE d), e), g) · Duración: 30 min

Con $producto = 'Portátil' y $precio = 799.99, construye estas frases y muéstralas en una tabla con dos columnas, Código y Resultado:

  1. 'El producto es $producto' (comillas simples).
  2. "El producto es $producto" (comillas dobles).
  3. "Hay 3 {$producto}s en el almacén" (llaves para separar la variable).
  4. La frase El Portátil cuesta 799.99 € hecha con concatenación (operador .).
  5. Una frase con comillas dobles que muestre literalmente $producto, usando la secuencia de escape \$.
  6. Un texto de dos líneas con heredoc (<<<TXT … TXT;). Muéstralo respetando el salto de línea con nl2br().

Escribe como comentario en el propio fichero qué diferencia has observado entre los distintos casos.


P04 · Ficha de datos: variables, constantes y tipos

RA/CE: RA2 – CE d), g) · Duración: 30 min

  • Define dos constantes: APP_NAME con define() y APP_VERSION con const.
  • Declara cuatro variables de un usuario, una de cada tipo escalar: nombre (string), edad (int), altura (float) y activo (bool).
  • Muestra una frase con interpolación: Carlos Ruiz tiene 19 años y mide 1.78 m.
  • Muestra una tabla con cada variable, su valor y su tipo (gettype()).
  • Muestra también la salida de var_dump() dentro de una etiqueta <pre>.
Para pensar

¿Qué muestra echo true? ¿Y echo false? ¿Por qué conviene usar var_export($valor, true) para enseñar un booleano? ¿Por qué gettype() dice double en lugar de float?


🟡 Nivel intermedio

P05 · Calculadora aritmética

RA/CE: RA2 – CE g) · Duración: 45 min

Con $num1 = 17 y $num2 = 5, muestra en dos listas:

Operadores aritméticos: suma, resta, multiplicación, división (/), división entera (intdiv()), resto (%) y potencia (**). La potencia muéstrala con separador de miles: 1.419.857.

Asignación e incremento:

  • Parte de $acumulado = 10 y aplica en orden += 5, *= 2, -= 4 y /= 2. Muestra el resultado final.
  • Con $contador = 1, muestra la diferencia entre ++$contador y $contador++.
  • Muestra el resultado de 2 + 3 * 4 y de (2 + 3) * 4.

Cuaderno

Antes de ejecutar, calcula a mano el valor final de $acumulado y de $contador. Luego compáralo con lo que muestra PHP.


P06 · Comparaciones débiles y estrictas

RA/CE: RA2 – CE g) · Duración: 45 min

Con $a = "50" (string) y $b = 50 (int), muestra una tabla con tres columnas: Expresión, Resultado (usa var_export(…, true)) y ¿Por qué? (tu explicación). Incluye estas expresiones:

Expresión Qué comprueba
$a == $b · $a === $b Igualdad débil y estricta
$a != $b · $a !== $b Desigualdad débil y estricta
$a <=> $b Operador nave espacial
"abc" == 0 Cambió en PHP 8
"1e3" == "1000" Cadenas numéricas
null == false · null === false Valores «vacíos»

Al final, muestra también var_dump($a == $b, $a === $b, $a !== $b).

Conclusión

Usa siempre === y !== salvo que tengas un motivo para no hacerlo. La comparación débil da sorpresas como la de "1e3" == "1000".


P07 · Conversión de tipos y funciones integradas

RA/CE: RA2 – CE d), g) · Duración: 1 h

Los datos que llegan de un formulario o de un fichero siempre son texto. En esta práctica vas a convertirlos y a usar funciones que PHP trae de serie.

Tabla 1: conversiones. Columnas Expresión, Resultado (var_export) y Tipo (gettype):

  • '10' + '5.5': conversión implícita al operar.
  • (int) '3.99': ¿redondea o trunca?
  • (float) '19,90' frente a (float) str_replace(',', '.', '19,90'): ¿qué pasa con la coma decimal?
  • intval('1A', 16): conversión desde hexadecimal.
  • (bool) '0' y (bool) '0.0'.
  • is_numeric('19,90').

Tabla 2: funciones integradas. Columnas Función y Resultado. Trabaja con el texto ' ñandú veloz ':

  • trim().
  • strlen() frente a mb_strlen(): ¿por qué no dan lo mismo?
  • mb_strtoupper() y mb_convert_case(…, MB_CASE_TITLE).
  • str_pad('3', 5, '0', STR_PAD_LEFT) → 00003.
  • round(2.675, 2), number_format() con formato español (59,70 €), max() y date('d/m/Y').
Pista

Las funciones que empiezan por mb_ trabajan con caracteres, no con bytes. En UTF-8, la ñ y las vocales con tilde ocupan 2 bytes.


P08 · Panel de información del servidor

RA/CE: RA2 – CE b), e), f) · Duración: 1 h

Crea un panel en dos columnas con información de PHP y de la petición.

Directivas (al principio del script):

  • Guarda el valor actual de display_errors con ini_get(). Después actívalo con ini_set('display_errors', '1') y error_reporting(E_ALL).
  • Fija la zona horaria con date_default_timezone_set('Europe/Madrid').

Columna PHP: fecha y hora, phpversion(), PHP_OS_FAMILY, php_sapi_name(), memory_limit y upload_max_filesize (con ini_get()), y el valor de display_errors antes y después del cambio.

Columna Petición: de la superglobal $_SERVER, muestra HTTP_HOST, REQUEST_METHOD, REMOTE_ADDR, SERVER_SOFTWARE y SCRIPT_FILENAME. Debajo, muestra HTTP_USER_AGENT completo.

Seguridad

El User-Agent lo envía el navegador y se puede falsificar. Muéstralo siempre con htmlspecialchars(). Usa también ?? 'No disponible' por si alguna clave no existe.

Para pensar

display_errors activado es útil mientras programas. ¿Por qué hay que desactivarlo en un servidor de producción?


🔴 Nivel avanzado

P09 · Ámbito de las variables

RA/CE: RA2 – CE h) · Duración: 1 h

Declara $mensaje = 'Hola desde el ámbito global' y escribe estas funciones:

Función Qué hace
sinGlobal() Intenta devolver $mensaje sin hacer nada especial. Usa ?? para que no dé error
conGlobal() Devuelve $mensaje usando la palabra global
conArrayGlobals() Devuelve $mensaje usando $GLOBALS['mensaje']
contadorNormal() Crea $contador = 0, lo incrementa y lo devuelve
incrementar_visitas() Igual, pero con static $contador = 0
  • Muestra en una tabla lo que devuelve cada una de las tres primeras funciones.
  • Llama 5 veces seguidas a contadorNormal() y otras 5 a incrementar_visitas(), y muestra los resultados en una tabla.
  • Recarga la página: ¿el contador estático sigue sumando o vuelve a empezar? Explícalo en un comentario.

Cuaderno

Dibuja un esquema con dos «cajas»: el ámbito global y el ámbito de una función. Indica qué variables hay en cada una y cómo se comunican.


P10 · Factura de un trabajador autónomo

RA/CE: RA2 – CE g), h) · Duración: 1 h

Calcula la factura mensual de un trabajador autónomo. La fórmula es: total = base imponible + IVA − retención de IRPF.

  • Define las constantes IVA (0.21) con define() y RETENCION_IRPF (0.15) con const.
  • Declara las variables globales $tarifaHora = 25.50, $horasTrabajadas = 160 y $baseImponible = 0.0.
  • Escribe la función calcularFactura(int $horas, float &$base): float, que:
    • lee $tarifaHora con la palabra global;
    • guarda la base imponible en $base, que se recibe por referencia;
    • devuelve el total de la factura.
  • Muestra la factura: tarifa, horas, base imponible, IVA, IRPF y total, con formato español (4.080,00 €).
  • Comprueba que $baseImponible ya no vale 0 después de llamar a la función.

Copia frente a referencia: con $original = 100, haz $copia = $original; y $referencia = &$original;. Cambia $referencia a 500 y muestra cuánto valen las tres variables.

Resultado esperado: base 4.080,00 €, IVA 856,80 €, IRPF 612,00 € y total 4.324,80 €.


Entrega

Cómo entregar

  • Sube a Moodle (aulavirtual.murciaeduca.es) un .zip llamado ut02-apellido-nombre.zip con todos los ficheros ut02pXX.php.
  • Añade en el comentario de la entrega el enlace a tu repositorio de GitHub.
  • Entrega también las fotos de las páginas del cuaderno que se piden en P05 y P09.
  • Mínimo para entregar: todas las prácticas de nivel básico e intermedio (P01–P08). Las de nivel avanzado suben nota.

Rúbrica

Cada práctica se puntúa sobre 10:

Criterio Peso Excelente Suficiente Insuficiente
Funcionalidad 40 % Muestra todo lo que pide el enunciado con resultados correctos Muestra lo principal Faltan partes o hay errores de PHP
Sintaxis e integración en HTML 25 % PHP al principio, <?= ?> en el HTML y código fuente final limpio Mezcla algo de lógica dentro del HTML Etiquetas mal abiertas o cerradas, HTML roto
Tipos, operadores y ámbitos 15 % Explica correctamente los resultados en comentarios Resultados correctos sin explicación Confunde tipos, comparaciones o ámbitos
Calidad del código 10 % Buenos nombres de variables y comentarios útiles Correcto pero poco comentado Desordenado y sin comentarios
Interfaz 5 % Bulma bien usado y datos escapados Interfaz básica Sin estilos
Git y cuaderno 5 % Un commit por práctica y cuaderno completo Pocos commits o cuaderno incompleto Sin repositorio o sin cuaderno

La nota del boletín cuenta dentro del 50 % de tareas y prácticas del RA2.