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>usandoechoy 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
widthsea el porcentaje del minuto transcurrido. Redondea conround().
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:
'El producto es $producto'(comillas simples)."El producto es $producto"(comillas dobles)."Hay 3 {$producto}s en el almacén"(llaves para separar la variable).- La frase El Portátil cuesta 799.99 € hecha con concatenación (operador
.). - Una frase con comillas dobles que muestre literalmente
$producto, usando la secuencia de escape\$. - Un texto de dos líneas con heredoc (
<<<TXT … TXT;). Muéstralo respetando el salto de línea connl2br().
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_NAMEcondefine()yAPP_VERSIONconconst. - 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 = 10y aplica en orden+= 5,*= 2,-= 4y/= 2. Muestra el resultado final. - Con
$contador = 1, muestra la diferencia entre++$contadory$contador++. - Muestra el resultado de
2 + 3 * 4y 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 amb_strlen(): ¿por qué no dan lo mismo?mb_strtoupper()ymb_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()ydate('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_errorsconini_get(). Después actívalo conini_set('display_errors', '1')yerror_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 aincrementar_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) condefine()yRETENCION_IRPF(0.15) conconst. - Declara las variables globales
$tarifaHora = 25.50,$horasTrabajadas = 160y$baseImponible = 0.0. - Escribe la función
calcularFactura(int $horas, float &$base): float, que:- lee
$tarifaHoracon la palabraglobal; - guarda la base imponible en
$base, que se recibe por referencia; - devuelve el total de la factura.
- lee
- Muestra la factura: tarifa, horas, base imponible, IVA, IRPF y total, con formato español (
4.080,00 €). - Comprueba que
$baseImponibleya 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
.zipllamadout02-apellido-nombre.zipcon todos los ficherosut02pXX.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.