PHP se ejecuta en el servidor: genera la página HTML antes de enviarla al navegador. Con él están hechos WordPress, Wikipedia (MediaWiki) y frameworks como Laravel y Symfony. Las versiones modernas (PHP 8) tienen tipos, clases y un rendimiento muy distinto al del PHP de hace años.
Webs dinámicas y tiendas online
WordPress y otros gestores de contenidos
APIs y paneles de administración
Para empezar: Instala PHP desde php.net (o con un paquete como XAMPP) y lanza el servidor de pruebas con php -S localhost:8000.
Nivel 1 Básico
1
Lección 1 · Básico
Tu primer script
El código PHP va entre <?php y ?>, y puede mezclarse con HTML: el servidor ejecuta el PHP y envía al navegador solo el resultado. echo escribe texto en la página.
PHP trae un servidor web de pruebas: en la carpeta del proyecto, php -S localhost:8000 y abre esa dirección en el navegador.
Respuesta: Añade «huevos» al final. Con corchetes vacíos, PHP añade el valor en la siguiente posición libre.
Nivel 2 Intermedio
5
Lección 5 · Intermedio
Funciones con tipos
Las funciones se declaran con function. Desde PHP 7 puedes indicar el tipo de los parámetros y del valor devuelto, y con declare(strict_types=1); PHP los respeta sin convertir.
Los parámetros pueden tener valor por defecto y se pueden pasar por nombre (PHP 8).
Respuesta: Hace que PHP no convierta los tipos de los argumentos. Con tipos estrictos, pasar un texto donde se espera float da un error en lugar de convertirlo.
6
Lección 6 · Intermedio
Formularios y seguridad
Los datos de un formulario enviado con method="post" llegan en el array $_POST. Nunca confíes en ellos: valídalos antes de usarlos.
Para mostrar en la página algo que escribió el usuario, pásalo por htmlspecialchars(). Así un <script> se muestra como texto y no se ejecuta (se evita el ataque XSS).
Completa la función que evita que el texto del usuario se interprete como HTML.
echo ($comentario);
Ver la solución
Respuesta:htmlspecialchars. htmlspecialchars convierte <, >, & y las comillas en entidades HTML inofensivas.
7
Lección 7 · Intermedio
Clases y objetos
Una clase agrupa datos (propiedades) y funciones (métodos). Con la promoción de propiedades del constructor (PHP 8) declaras y asignas las propiedades en una sola línea.
$this es el propio objeto, y la flecha -> accede a sus propiedades y métodos.
Ejemplo práctico
<?php
class Cuenta
{
public function __construct(
public readonly string $titular,
private float $saldo = 0,
) {}
public function ingresar(float $cantidad): void
{
$this->saldo += $cantidad;
}
public function saldo(): float
{
return $this->saldo;
}
}
$c = new Cuenta("Ana");
$c->ingresar(50);
echo $c->titular . ": " . $c->saldo(); // Ana: 50
Ejercicio
¿Con qué operador llamas a un método de un objeto en PHP?
Ver la solución
Respuesta: ->. $objeto->metodo() llama a un método de ese objeto; :: es para lo estático.
Nivel 3 Avanzado
8
Lección 8 · Avanzado
Bases de datos con PDO
PDO es la forma estándar de conectar PHP con MySQL, PostgreSQL o SQLite. Usa siempre consultas preparadas: escribes huecos y pasas los valores aparte.
Así evitas la inyección SQL, porque los datos del usuario nunca se mezclan con el código de la consulta.
Ejemplo práctico
<?php
$pdo = new PDO("sqlite:tienda.db", options: [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$consulta = $pdo->prepare("SELECT nombre, precio FROM productos WHERE precio < :max");
$consulta->execute(["max" => 20]);
foreach ($consulta as $fila) {
echo $fila["nombre"] . ": " . $fila["precio"] . "\n";
}
Ejercicio
¿Por qué usar prepare() y execute() en lugar de pegar el valor en la consulta?
Ver la solución
Respuesta: Para evitar la inyección SQL. Los valores van separados de la consulta, así que no pueden cambiar lo que hace.
9
Lección 9 · Avanzado
Composer y la carga automática
Composer es el gestor de paquetes de PHP: composer require paquete descarga una biblioteca en la carpeta vendor y la apunta en composer.json.
Incluyendo vendor/autoload.php, las clases se cargan solas cuando las usas, sin escribir un require por archivo.
Ejemplo práctico
# En la terminal
composer init
composer require monolog/monolog
<?php
require __DIR__ . "/vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger("tienda");
$log->pushHandler(new StreamHandler(__DIR__ . "/app.log"));
$log->info("Pedido recibido", ["id" => 42]);
Ejercicio
Completa el archivo que activa la carga automática de las bibliotecas.
require __DIR__ . "/vendor/.php";
Ver la solución
Respuesta:autoload. vendor/autoload.php, generado por Composer, carga cada clase la primera vez que se usa.
10
Lección 10 · Avanzado
Errores y excepciones
Cuando algo no puede continuar, lanza una excepción con throw y captúrala donde sepas qué hacer, con try y catch. finally se ejecuta siempre.
En producción no muestres los errores en la página (pueden revelar datos internos): regístralos en un archivo.
Ejemplo práctico
<?php
function dividir(float $a, float $b): float
{
if ($b == 0) {
throw new InvalidArgumentException("No se puede dividir entre cero");
}
return $a / $b;
}
try {
echo dividir(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
} finally {
echo "\nCálculo terminado";
}
Ejercicio
Completa la palabra que lanza una excepción.
new RuntimeException("Falta el archivo");
Ver la solución
Respuesta:throw. throw lanza la excepción, que sube hasta el catch más cercano.
¿Has terminado? Sigue practicando
Repasa los conceptos en el diccionario, practica con estas herramientas o prueba otro lenguaje: las ideas que has aprendido (variables, condiciones, funciones, objetos…) te servirán en cualquiera.
* Porcentaje de personas que dijeron haber usado PHP en la Stack Overflow Developer Survey 2026: Technology (pregunta sobre lenguajes de programación, de scripts y de marcado; todas las respuestas). El progreso de las lecciones se guarda solo en este navegador.
¿Nos dejas medir las visitas?
Con tu permiso usamos Google Analytics, que guarda cookies, para saber cuántas personas visitan la web y qué páginas les resultan útiles. No usamos cookies de publicidad y tus archivos nunca salen de tu navegador. Puedes cambiar de opinión cuando quieras en «Configurar cookies», al pie de la página. Más información.