1. PHP vive dentro del HTML
PHP nació en 1994 como un conjunto de herramientas para páginas personales, y esa herencia se nota en su rasgo más característico: el código se mezcla con el HTML. Un fichero .php es, en principio, HTML normal; todo lo que va entre <?php y ?> se ejecuta en el servidor y lo que escribe con echo se inserta en ese punto de la página. El navegador nunca ve el código PHP, solo el HTML resultante.
1<?php
2$nombre = 'Lucía';
3$hora = (int) date('G');
4$saludo = $hora < 14 ? 'Buenos días' : 'Buenas tardes';
5?>
6<!doctype html>
7<html lang="es">
8<body>
9 <h1><?= $saludo ?>, <?= htmlspecialchars($nombre) ?></h1>
10
11 <?php if ($hora >= 22): ?>
12 <p>Se hace tarde, ¡a descansar!</p>
13 <?php endif; ?>
14</body>
15</html>Fíjate en dos detalles. <?= … ?> es la forma corta de <?php echo … ?>, perfecta para insertar un valor. Y dentro del HTML se usa la sintaxis alternativa de las estructuras de control (if (…): … endif;, foreach (…): … endforeach;), que se lee mucho mejor que llaves sueltas entre etiquetas. Cuando un fichero es solo PHP, se omite el ?> final para no enviar espacios en blanco por accidente.
2. Variables, tipos y textos
Las variables empiezan siempre por $ y no se declaran: existen desde que les das un valor. PHP es de tipado dinámico, como JavaScript, pero desde la versión 7 permite declarar los tipos de los parámetros y del valor devuelto de las funciones. Si además escribes declare(strict_types=1); al principio del fichero, PHP dejará de convertir tipos por su cuenta y te avisará en cuanto pases un texto donde esperaba un número. Es una red de seguridad que conviene usar siempre.
| Tipo | Ejemplo | Comprobación |
|---|---|---|
| int | 42 | is_int($x) |
| float | 3.14 | is_float($x) |
| string | 'hola' o "hola $nombre" | is_string($x) |
| bool | true, false | is_bool($x) |
| array | [1, 2, 3] o ['clave' => 'valor'] | is_array($x) |
| null | null | is_null($x) o $x === null |
| object | new Producto() | $x instanceof Producto |
Comillas simples y dobles
Con comillas simples el texto es literal. Con comillas dobles PHP sustituye las variables que encuentre y reconoce secuencias como \n. Para expresiones más complejas, envuelve la variable entre llaves. Y para concatenar se usa el punto, no el +:
1$producto = ['nombre' => 'Teclado', 'precio' => 24.99];
2
3echo 'Hola $nombre\n'; // literal: Hola $nombre\n
4echo "Precio: {$producto['precio']} €\n"; // sustituye el valor
5echo 'Total: ' . $producto['precio'] * 2 . " €\n";
6echo number_format(1234.5, 2, ',', '.'); // 1.234,503. Arrays: la navaja suiza de PHP
En PHP, un array es a la vez una lista y un diccionario: cada elemento tiene una clave, que puede ser un número (array indexado) o un texto (array asociativo). Con arrays se representan casi todos los datos de una aplicación: una fila de la base de datos es un array asociativo, y un listado es un array de ellos.
Tres formas de usar un array
1$notas = ['Ana' => 8.5, 'Luis' => 4, 'Marta' => 9.25];
2
3foreach ($notas as $alumno => $nota) {
4 echo "$alumno: $nota\n";
5}
6
7$aprobados = array_filter($notas, fn($n) => $n >= 5); // conserva las claves
8$redondeadas = array_map(fn($n) => round($n), $notas);
9arsort($notas); // ordena por valor, de mayor a menor
10echo implode(', ', array_keys($aprobados)); // Ana, Marta
11echo count($notas), ' ', array_sum($notas) / count($notas);| Función | Para qué |
|---|---|
| count, in_array, array_key_exists | Cuántos hay, si está un valor, si existe una clave |
| array_map, array_filter, array_reduce | Transformar, filtrar y acumular (como en JavaScript) |
| sort / rsort, asort / arsort, ksort, usort | Ordenar por valor, por valor conservando claves, por clave o con una función |
| array_slice, array_merge, array_column | Extraer un trozo, unir arrays, sacar una columna de una tabla |
| explode / implode | Texto → array y array → texto |
4. Estructuras de control y funciones
if, while, for y switch funcionan como en Java o JavaScript. PHP añade foreach, la forma natural de recorrer arrays, y desde PHP 8 la expresión match, una versión moderna de switch que devuelve un valor, compara con === y no necesita break.
1declare(strict_types=1);
2
3function precioFinal(float $precio, float $iva = 0.21, float $descuento = 0): float
4{
5 return round($precio * (1 - $descuento) * (1 + $iva), 2);
6}
7
8echo precioFinal(100); // 121
9echo precioFinal(100, descuento: 0.1); // 108.9 (argumento con nombre)
10
11$envio = match (true) {
12 $total >= 50 => 0,
13 $total >= 20 => 2.95,
14 default => 4.95,
15};Los argumentos con nombre (descuento: 0.1) permiten saltarse los parámetros opcionales intermedios y hacen las llamadas más legibles. Las funciones flecha (fn($x) => $x * 2) sirven para funciones cortas y pueden usar las variables de alrededor sin más; las funciones anónimas normales necesitan declararlas con use ($variable).
Dividir el código en ficheros
Para reutilizar código entre páginas se usan require e include. La diferencia es qué pasa si el fichero no existe: require detiene el script con un error y include solo avisa. Las versiones require_once e include_once evitan cargar dos veces el mismo fichero. Para una cabecera y un pie comunes, require 'partes/cabecera.php'; en proyectos modernos, el autoload de Composer carga las clases automáticamente.
- Errores típicos: olvidar el
$, usar+para unir textos, comparar con==(con"abc" == 0ya no es true desde PHP 8, pero===sigue siendo lo correcto), y escribirechode datos del usuario sinhtmlspecialchars.
Tu mejor aliado: la documentación
php.net/nombre_funcion en la barra de direcciones y llegas directamente.5. Pruébalo y practica
Este editor ejecuta PHP 8.3 de verdad en un servidor. Los programas leen datos de la entrada estándar (lo que escribas en el cuadro de entrada), igual que un script leería los datos de un formulario.
Cambia los datos y ejecuta.
Retos de PHP en el IDE
Escribe el código que falta y pulsa Ejecutar tests: se ejecuta con PHP 8.3 real y se prueba con varios casos, algunos ocultos.
PHP genera HTML. Lee un número de la entrada y escribe su tabla de multiplicar del 1 al 10 como una tabla HTML, con una fila por línea y dos espacios de sangría: « <tr><td>7 x 1</td><td>7</td></tr>». Si la entrada no es un entero entre 1 y 100, escribe «<p>Número no válido</p>».
Lee un texto (puede tener varias líneas) y muestra las tres palabras más frecuentes con el formato «palabra: veces», en minúsculas. Una palabra es una secuencia de letras (incluidas las tildes y la ñ). Si dos palabras se repiten lo mismo, va primero la que sea menor alfabéticamente.
Cada línea de la entrada es «producto;precio;cantidad». Escribe una línea por producto con el formato «Teclado x 2 = 49,98 €» y al final la base, el IVA y el total: «Base: 62,48 €», «IVA (21%): 13,12 €», «Total: 75,60 €». Las cantidades usan coma decimal y punto de miles (1.234,50 €). Las líneas que no tengan tres campos, un precio numérico y una cantidad entera se ignoran mostrando «Línea ignorada: …».