Saltar al contenido
php.test.php · devschool

Retos de PHP

104 preguntas ordenadas como el curso de PHP. Hazlas en orden o salta al tema que quieras repasar.

devschool $ 0 aciertos de 0 respondidas

¿Qué es PHP?

¿Te atascas? Repasa la lección ¿Qué es PHP?.

[PHP] Cuando alguien visita tienda.php, ¿qué recibe su navegador?

[PHP] ¿Qué HTML llega al navegador al cargar esta página?
<p>Tienes <?= 3 * 4 ?> clases</p>

[PHP] Haces doble clic en hola.php y el navegador muestra el código tal cual, sin ejecutarlo. ¿Por qué?

[PHP] ¿Por qué la contraseña de la base de datos puede guardarse en un archivo PHP sin que los visitantes la vean?

Servidor local

¿Te atascas? Repasa la lección Servidor local.

[PHP] ¿Qué hace el comando php -S localhost:8000 ejecutado en la carpeta de tu proyecto?

[PHP] Con XAMPP, ¿qué dirección abre el archivo C:\xampp\htdocs\tienda\index.php?

[PHP] Apache no arranca en XAMPP y el panel avisa de que el puerto 80 está ocupado. ¿Qué puedes hacer?

[PHP] ¿Qué valor de display_errors es el adecuado en una web publicada y por qué?

Sintaxis y echo

¿Te atascas? Repasa la lección Sintaxis y echo.

[PHP] ¿Qué muestra este código?
<?php
$r = print "Hola\n";
echo $r, "\n";

[PHP] Falta el punto y coma al final de la línea 2. ¿Qué ocurre al ejecutar el script?
<?php
$a = 5
$b = 3;
echo $a + $b;

[PHP] ¿Qué hace PHP con este código?
<?php
$Precio = 10;
echo $precio;

[PHP] ¿Con qué es equivalente <p>Hola, <?= $socio ?></p>?

Variables y tipos

¿Te atascas? Repasa la lección Variables y tipos.

[PHP] ¿Qué muestra este código?
var_dump("5" + 3);

[PHP] ¿Qué muestra este código?
var_dump((bool) "0");
var_dump((bool) "false");

[PHP] ¿Qué muestra la segunda línea de este código?
var_dump(0.1 + 0.2);
var_dump(0.1 + 0.2 == 0.3);

[PHP] Con declare(strict_types=1) activado, ¿qué ocurre al llamar a esta función?
<?php
declare(strict_types=1);

function doble(int $n): int { return $n * 2; }

echo doble("5");

Operadores

¿Te atascas? Repasa la lección Operadores.

[PHP] ¿Qué muestra este código?
$descuento = 0;
echo $descuento ?: 10, " ";
echo $descuento ?? 10;

[PHP] ¿Qué valor tiene $a tras ejecutar la primera línea?
$a = true and false;
var_dump($a);

[PHP] ¿Qué muestra este código?
echo 17 % 5, " ", intdiv(17, 5), " ", 17 / 5;

[PHP] ¿Qué muestra este código con el operador nave espacial?
echo 3 <=> 8, 8 <=> 8, 9 <=> 2;

Cadenas

¿Te atascas? Repasa la lección Cadenas.

[PHP] ¿Qué muestra este código?
echo strlen("Año"), mb_strlen("Año");

[PHP] El texto es "Cuerda de 60 m". ¿Qué hace este código?
$frase = "Cuerda de 60 m";
if (strpos($frase, "Cuerda")) {
    echo "si";
} else {
    echo "no";
}

[PHP] ¿Qué muestra este código?
echo substr("RES-2026-0457", -4), str_pad("7", 4, "0", STR_PAD_LEFT);

[PHP] Con $nombre = "Ana", ¿qué muestra este código?
echo 'Hola $nombre\n';

if, switch y match

¿Te atascas? Repasa la lección if, switch y match.

[PHP] ¿Qué muestra este código?
$n = 2;
switch ($n) {
    case 1: echo "uno";
    case 2: echo "dos";
    case 3: echo "tres"; break;
    default: echo "def";
}

[PHP] Los datos de un formulario llegan como texto. ¿Qué muestra este código?
$v = "1";
echo match ($v) {
    1 => "int",
    "1" => "str",
};

[PHP] ¿Qué ocurre si $estado vale "cancelado" en este match?
echo match ($estado) {
    "pendiente" => "En espera",
    "pagado" => "Confirmado",
};

[PHP] Con $x = -1, ¿qué muestra este código?
$x = -1;
if ($x > 0);
{
    echo "dentro";
}

Bucles

¿Te atascas? Repasa la lección Bucles.

[PHP] ¿Qué contiene $a al terminar este código?
$a = [1, 2, 3];
foreach ($a as &$x) {}
foreach ($a as $x) {}
echo implode(",", $a);

[PHP] ¿Qué muestra este bucle?
for ($i = 0; $i < 10; $i += 3) {
    if ($i == 3) {
        continue;
    }
    echo $i;
}

[PHP] ¿Qué muestra este código con do-while?
$i = 0;
do {
    echo $i;
} while ($i++ < 2);

[PHP] ¿Qué se imprime y qué error de planteamiento hay?
foreach ([10, 20, 30] as $n) {
    $total = 0;
    $total += $n;
}
echo $total;

Arrays

¿Te atascas? Repasa la lección Arrays.

[PHP] ¿Qué claves tiene $a al final?
$a = [1, 2, 3];
unset($a[1]);
$a[] = 9;
echo implode(",", array_keys($a));

[PHP] ¿Qué clave recibe "b"?
$b = [3 => "a"];
$b[] = "b";

[PHP] ¿Qué muestra este código?
$p = ["nombre" => "Casco", "descuento" => null];
var_dump(isset($p["descuento"]));
var_dump(array_key_exists("descuento", $p));

[PHP] ¿Qué muestra este código?
$original = [1, 2, 3];
$copia = $original;
$copia[] = 4;
echo count($original);

Funciones de arrays

¿Te atascas? Repasa la lección Funciones de arrays.

[PHP] ¿Qué muestra este código?
$a = [3, 1, 2];
$a = sort($a);
var_dump($a);

[PHP] ¿Qué muestra este código con el operador + entre arrays?
echo json_encode([1, 2] + [5, 6, 7]);

[PHP] ¿Qué valor tiene $total?
$total = array_reduce([1, 2, 3], fn($suma, $n) => $suma + $n * 2, 10);

[PHP] El elemento buscado puede estar en la posición 0. ¿Cómo compruebas bien que array_search no lo encontró?

Funciones

¿Te atascas? Repasa la lección Funciones.

[PHP] ¿Qué muestra este código?
function siguiente() {
    static $n = 0;
    return ++$n;
}
siguiente();
siguiente();
echo siguiente();

[PHP] ¿Qué muestra este código?
$k = 10;
$f = fn($x) => $x + $k;
$k = 100;
echo $f(1);

[PHP] ¿Qué muestra este código?
function a(array $x) { $x[] = 1; }
function b(array &$x) { $x[] = 1; }

$lista = [];
a($lista);
b($lista);
echo count($lista);

[PHP] ¿Qué devuelve h(1, c: 9)?
function h($a, $b = 2, $c = 3) {
    return "$a$b$c";
}

include y require

¿Te atascas? Repasa la lección include y require.

[PHP] El archivo no existe. ¿Qué diferencia hay entre include y require?

[PHP] Incluyes dos veces un archivo con la función precioConIva() y aparece "Cannot redeclare function". ¿Cuál es la solución más sencilla?

[PHP] ¿Por qué se escribe require __DIR__ . '/includes/funciones.php' en vez de una ruta relativa?

[PHP] ¿Qué riesgo tiene include $_GET['seccion'] . '.php';?

Fechas

¿Te atascas? Repasa la lección Fechas.

[PHP] ¿Qué fecha muestra este código?
$c = new DateTimeImmutable('2026-01-31');
echo $c->modify('+1 month')->format('d/m/Y');

[PHP] ¿Qué muestra este código?
$f = new DateTimeImmutable('2026-03-05');
$f->modify('+1 week');
echo $f->format('d/m');

[PHP] ¿Qué fecha muestra este código?
date_default_timezone_set('Europe/Madrid');
echo date('d/m/Y', strtotime('05/03/2026'));

[PHP] Son las 14:30 del 1 de julio de 2026. ¿Qué muestra date('H:m')?

Formularios GET y POST

¿Te atascas? Repasa la lección Formularios GET y POST.

[PHP] Un campo <input type="number" name="plazas"> se envía con POST. ¿Qué tipo tiene $_POST['plazas']?

[PHP] Un grupo de casillas comparte name="extras" (sin corchetes) y marcas varias. ¿Qué recibe PHP?

[PHP] ¿Qué muestra este código?
$d = ["edad" => "0", "ciudad" => ""];
var_dump(isset($d["ciudad"]));
var_dump(empty($d["edad"]));

[PHP] ¿Para qué sirve exit justo después de header('Location: gracias.php')?

Validar y sanear

¿Te atascas? Repasa la lección Validar y sanear.

[PHP] ¿Qué devuelve este código y por qué es un problema en un if (!...)?
var_dump(filter_var('0', FILTER_VALIDATE_INT));

[PHP] Pones required y pattern en el HTML de tu formulario. ¿Hace falta validar también en PHP?

[PHP] ¿Qué muestra este código?
echo htmlspecialchars('<b>Hi</b> & "yo"');

[PHP] ¿Cuándo se debe aplicar htmlspecialchars a un comentario de un usuario?

Sesiones y cookies

¿Te atascas? Repasa la lección Sesiones y cookies.

[PHP] ¿Dónde se almacenan realmente los datos de $_SESSION?

[PHP] ¿Qué muestra este código?
$h1 = password_hash('x', PASSWORD_DEFAULT);
$h2 = password_hash('x', PASSWORD_DEFAULT);
var_dump($h1 === $h2);

[PHP] ¿Para qué sirve session_regenerate_id(true) justo al iniciar sesión?

[PHP] Haces setcookie('idioma', 'gl', ...) y en la línea siguiente lees $_COOKIE['idioma']. ¿Qué pasa?

Ficheros y subidas

¿Te atascas? Repasa la lección Ficheros y subidas.

[PHP] Si el archivo notas.txt no existe, ¿qué muestra este código?
file_put_contents("notas.txt", "a\n");
file_put_contents("notas.txt", "b\n");
echo file_get_contents("notas.txt");

[PHP] Subes una foto y $_FILES llega vacío aunque el formulario tiene <input type="file">. ¿Qué falta casi seguro?

[PHP] ¿Cómo se comprueba con seguridad que un archivo subido es una imagen?

[PHP] ¿Por qué se guarda un archivo subido con un nombre aleatorio (por ejemplo, bin2hex(random_bytes(16)) más la extensión elegida por ti)?

Clases y objetos

¿Te atascas? Repasa la lección Clases y objetos.

[PHP] ¿Qué muestra este código?
class Carrito { public array $p = []; }

$a = new Carrito();
$b = $a;
$b->p[] = 'x';
$c = clone $a;
$c->p[] = 'y';

echo count($a->p), count($c->p);

[PHP] ¿Qué ocurre al ejecutar la última línea?
class Pedido {
    public function __construct(public readonly int $id) {}
}

$p = new Pedido(1);
$p->id = 2;

[PHP] ¿Qué muestra este código?
class Reserva {
    private static int $n = 0;
    public function __construct() { self::$n++; }
    public static function total(): int { return self::$n; }
}

new Reserva();
new Reserva();
echo Reserva::total();

[PHP] Con un enum Dificultad: string, ¿qué devuelve Dificultad::tryFrom('extrema') si ese valor no existe?

Herencia e interfaces

¿Te atascas? Repasa la lección Herencia e interfaces.

[PHP] ¿Qué muestra este código?
class A {
    public function __construct(protected string $n) { echo "A "; }
    public function hola() { return "A:$this->n"; }
}
class B extends A {
    public function __construct(string $n) { parent::__construct($n); echo "B "; }
    public function hola() { return "B+" . parent::hola(); }
}
echo (new B("z"))->hola();

[PHP] ¿Qué ocurre al hacer new de una clase abstracta o de una interfaz?

[PHP] ¿Cuándo es mejor una interfaz que una clase abstracta?

[PHP] ¿Qué hace use App\Modelos\Socio; al principio de un archivo?

Excepciones

¿Te atascas? Repasa la lección Excepciones.

[PHP] ¿Qué muestra este código?
function p() {
    echo "open ";
    try {
        return "ok";
    } finally {
        echo "close ";
    }
}

echo p();

[PHP] ¿Qué ocurre al ejecutar este código?
try {
    echo intdiv(1, 0);
} catch (Exception $e) {
    echo "capturada";
}

[PHP] InvalidArgumentException extiende LogicException. ¿Qué imprime este código?
try {
    throw new InvalidArgumentException("x");
} catch (LogicException $e) {
    echo "logic";
} catch (InvalidArgumentException $e) {
    echo "inv";
}

[PHP] ¿Para qué sirve el argumento previous al lanzar una excepción?

MySQL con PDO

¿Te atascas? Repasa la lección MySQL con PDO.

[PHP] ¿Qué problema evitan las consultas preparadas con parámetros (? o :nombre)?

[PHP] ¿Qué hay mal en esta consulta preparada?
$q = $pdo->prepare("SELECT * FROM rutas WHERE zona = '?'");
$q->execute(['Gredos']);

[PHP] Buscas un id que no existe con $consulta->fetch(). ¿Qué devuelve?

[PHP] ¿Cuántas filas hay en la tabla al final?
$pdo->exec('INSERT INTO t VALUES (1), (2)');

$pdo->beginTransaction();
$pdo->exec('INSERT INTO t VALUES (3)');
$pdo->rollBack();

echo $pdo->query('SELECT COUNT(*) FROM t')->fetchColumn();

CRUD con PDO

¿Te atascas? Repasa la lección CRUD con PDO.

[PHP] ¿Por qué borrar con un enlace GET (borrar.php?id=5) es mala idea?

[PHP] Tras guardar un libro nuevo con éxito, ¿qué debe hacer el script?

[PHP] ¿Qué muestra este código?
function borrarLibro(PDO $pdo, int $id): bool
{
    $c = $pdo->prepare('DELETE FROM libros WHERE id = ?');
    $c->execute([$id]);
    return $c->rowCount() === 1;
}

var_dump(borrarLibro($pdo, 3));   // existía
var_dump(borrarLibro($pdo, 3));

[PHP] En formulario.php?id=999 no existe ese libro. ¿Qué es lo correcto?

Seguridad

¿Te atascas? Repasa la lección Seguridad.

[PHP] ¿Qué devuelve esta consulta si el atacante escribe x' OR '1'='1 como nombre?
$nombre = $_POST['nombre'];
$sql = "SELECT * FROM usuarios WHERE nombre = '$nombre'";
$filas = $pdo->query($sql)->fetchAll();

[PHP] ¿Qué imprime este código en PHP 8.4?
echo htmlspecialchars('<b>"hola"</b>');

[PHP] ¿Por qué se compara el token CSRF con hash_equals() en lugar de ===?

[PHP] ¿En qué momento hay que llamar a session_regenerate_id(true) para evitar la fijación de sesión?

JSON y APIs

¿Te atascas? Repasa la lección JSON y APIs.

[PHP] ¿Qué muestra este código?
echo json_encode([]), ' ', json_encode((object) []);

[PHP] ¿Qué JSON se obtiene?
echo json_encode(array_filter([5, 12, 8, 21], fn($km) => $km > 10));

[PHP] ¿Qué ocurre aquí?
$o = json_decode('{"a":1}');
echo $o['a'];

[PHP] ¿Qué devuelve json_decode('{a:1}') sin la opción JSON_THROW_ON_ERROR?
var_dump(json_decode('{a:1}'));

Composer

¿Te atascas? Repasa la lección Composer.

[PHP] En composer.json aparece "monolog/monolog": "^3.9". ¿Qué versiones acepta?

[PHP] Clonas un proyecto que ya tiene composer.lock. ¿Qué comando debes usar para instalar las dependencias?

[PHP] Aparece "Class 'Monolog\Logger' not found" aunque has ejecutado composer require. ¿Qué falta casi seguro?

[PHP] ¿Qué debe subirse a Git y qué no?

Proyecto: visitas

¿Te atascas? Repasa la lección Proyecto: visitas.

[PHP] ¿Qué defiende un token CSRF guardado en la sesión y enviado en un campo oculto?

[PHP] ¿Por qué se compara el token CSRF con hash_equals() y no con ===?

[PHP] Con consultas preparadas, ¿cómo pasas LIMIT y OFFSET a MySQL?

[PHP] Un mensaje contiene <b> y saltos de línea. ¿Cuál es el orden correcto para mostrarlo?