Estos 20 ejercicios avanzados de PHP resueltos están pensados para quienes ya dominan sintaxis, formularios, PDO y bases de datos y quieren practicar conceptos de aplicaciones reales.
Vas a trabajar con POO, seguridad, autenticación, roles, consultas preparadas, MVC y Composer.
1. Crear una clase Producto
<?php class Producto { public function __construct( private string $nombre, private float $precio ) { } public function getNombre(): string { return $this->nombre; } public function getPrecio(): float { return $this->precio; } } ?>
2. Encapsular el stock de un producto
public function descontarStock(int $cantidad): void { if ($cantidad <= 0 || $cantidad > $this->stock) { throw new InvalidArgumentException('Stock inválido'); } $this->stock -= $cantidad; }
3. Crear una interfaz de notificaciones
interface Notificable { public function enviar(string $mensaje): void; }
4. Implementar notificaciones por email
class EmailNotificacion implements Notificable { public function enviar(string $mensaje): void { echo 'Email: ' . $mensaje; } }
5. Crear un repositorio con PDO
class ProductoRepository { public function __construct( private PDO $pdo ) { } public function todos(): array { return $this->pdo ->query('SELECT * FROM productos') ->fetchAll(PDO::FETCH_ASSOC); } }
6. Buscar por ID con una consulta preparada
public function buscar(int $id): ?array { $stmt = $this->pdo->prepare( 'SELECT * FROM productos WHERE id = :id' ); $stmt->execute(['id' => $id]); $resultado = $stmt->fetch(PDO::FETCH_ASSOC); return $resultado ?: null; }
7. Implementar una transacción
$pdo->beginTransaction(); try { // operaciones relacionadas $pdo->commit(); } catch (Throwable $e) { $pdo->rollBack(); throw $e; }
8. Login seguro con password_verify()
if ( $usuario && password_verify($password, $usuario['password']) ) { session_regenerate_id(true); $_SESSION['usuario_id'] = $usuario['id']; }
9. Middleware simple de autenticación
function requireLogin(): void { if (!isset($_SESSION['usuario_id'])) { header('Location: /login.php'); exit; } }
10. Controlar acceso por rol
function requireAdmin(): void { requireLogin(); if ($_SESSION['rol'] !== 'admin') { http_response_code(403); exit('Acceso denegado'); } }
11. Generar un token CSRF
if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); }
12. Validar el token CSRF
if ( !isset($_POST['csrf_token']) || !hash_equals( $_SESSION['csrf_token'], $_POST['csrf_token'] ) ) { http_response_code(403); exit; }
13. Crear una capa de servicio
class ProductoService { public function __construct( private ProductoRepository $repository ) { } public function listarActivos(): array { return array_filter( $this->repository->todos(), fn($producto) => $producto['activo'] ); } }
14. Crear un controlador MVC
class ProductoController { public function __construct( private ProductoService $service ) { } public function index(): void { $productos = $this->service->listarActivos(); require '../Views/productos/index.php'; } }
15. Crear un router simple
$ruta = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); switch ($ruta) { case '/productos': $controller->index(); break; default: http_response_code(404); }
16. Usar namespaces
<?php namespace App\Services; class ProductoService { } ?>
17. Configurar autoload PSR-4
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
Después:
composer dump-autoload
18. Crear una búsqueda paginada con PDO
$buscar = trim($_GET['buscar'] ?? ''); $pagina = max(1, (int) ($_GET['pagina'] ?? 1)); $limite = 20; $offset = ($pagina - 1) * $limite; $stmt = $pdo->prepare( 'SELECT * FROM productos WHERE nombre LIKE :buscar ORDER BY id DESC LIMIT :limite OFFSET :offset' ); $stmt->bindValue(':buscar', '%' . $buscar . '%'); $stmt->bindValue(':limite', $limite, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute();
19. Registrar errores en un archivo
try { // operación } catch (Throwable $e) { error_log( $e->getMessage() . PHP_EOL, 3, __DIR__ . '/app.log' ); }
20. Diseñar un mini sistema MVC completo
Objetivo: construir una aplicación de gestión de productos con:
- login;
- roles;
- CRUD;
- PDO;
- consultas preparadas;
- CSRF;
- arquitectura MVC;
- autoload PSR-4;
- validación;
- paginación y búsqueda.
Una estructura posible:
app/ ├── Controllers/ ├── Models/ ├── Repositories/ ├── Services/ └── Views/ config/ public/ vendor/ composer.json
¿Qué deberías poder hacer después?
Si podés resolver estos desafíos entendiendo cada parte, ya tenés una base muy sólida de PHP moderno y estás en condiciones de comenzar a trabajar con frameworks como Laravel con mucha más claridad.
Serie de ejercicios de PHP
- 20 ejercicios de PHP para principiantes resueltos paso a paso
- 20 ejercicios intermedios de PHP resueltos: arrays, funciones, formularios y PDO
- 20 ejercicios avanzados de PHP resueltos: POO, MySQL, seguridad y MVC
También podés ver todos los contenidos prácticos en la sección Ejercicios resueltos.
¿Te sirvió esta guía? ☕
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
2 opiniones en “20 ejercicios avanzados de PHP resueltos: POO, MySQL, seguridad y MVC”