Saltar al contenido
chuleta.php · devschool

Chuleta de PHP

Curso de PHP

Resumen de consulta rápida con lo esencial de PHP 8.4. Cada apartado enlaza a la lección donde se explica con calma.

Sintaxis y echo

CódigoQué hace
<?php ... ?>Abre y cierra un bloque de PHP (en archivos solo PHP no se cierra)
echo "Hola";Muestra un texto en la página
echo "a", "b";Muestra varios valores seguidos
<?= $nombre ?>Atajo de echo dentro del HTML
print_r($lista);Muestra un array de forma legible
var_dump(5.5);Muestra tipo y valor → float(5.5)
// comentarioComentario de una línea
/* comentario */Comentario de varias líneas
php -S localhost:8000Arranca el servidor de desarrollo
php archivo.phpEjecuta un archivo desde la terminal
<?php
declare(strict_types=1);

echo "Hola, mundo\n";

Más en: ¿Qué es PHP? · Instalación · Sintaxis

Variables y tipos

CódigoQué hace
$edad = 30;Crea una variable (empieza por $)
const IVA = 0.21;Constante
define("APP", "Tienda");Constante creada en tiempo de ejecución
gettype(3.5)"double"
is_int($x), is_string($x)Comprueban el tipo → true o false
isset($x)true si existe y no es null
empty($x)true si es "", 0, [], null o false
(int) "42abc"42
(float) "3.5"3.5
(string) 10"10"
(bool) "0"false
intval("12")12
unset($x);Borra la variable
TipoEjemplo
int42, 1_000_000
float3.14
string"hola", 'hola'
booltrue, false
array[1, 2, 3]
nullnull (sin valor)

Más en: Variables y tipos

Operadores

CódigoResultado
7 % 31 (resto)
intdiv(7, 2)3 (división entera)
2 ** 101024
$x += 5;$x = $x + 5;
"a" . "b""ab" (concatena)
$t .= "más";Añade texto al final
5 == "5"true (compara convirtiendo)
5 === "5"false (estricta: úsala siempre)
3 <=> 5-1 (nave espacial: -1, 0 o 1)
$a ?? "defecto"$a, o "defecto" si no existe o es null
$a ??= 10;Asigna solo si es null
$u?->nombrenull si $u es null (nullsafe)
$edad >= 18 ? "adulto" : "menor"Operador ternario
&&, ||, !Y, O, NO

Más en: Operadores

Cadenas

CódigoResultado
"Hola $nombre"Interpola la variable (solo con comillas dobles)
"Total: {$p['precio']} €"Interpola una posición de array
'Hola $nombre'Texto literal, no interpola
strlen("hola")4 (bytes)
mb_strlen("año")3 (caracteres)
strtoupper("hola")"HOLA"
mb_strtoupper("año")"AÑO"
ucfirst("hola")"Hola"
trim(" hola ")"hola"
str_contains("casa", "as")true
str_starts_with("casa", "ca")true (también str_ends_with)
strpos("banana", "n")2 (false si no está)
substr("PHP moderno", 0, 3)"PHP"
str_replace("o", "0", "hola")"h0la"
explode(",", "a,b,c")["a", "b", "c"]
implode("-", ["a", "b"])"a-b"
str_pad("7", 3, "0", STR_PAD_LEFT)"007"
number_format(1234.5, 2, ",", ".")"1.234,50"
sprintf("%05.1f", 3.14159)"003.1"
str_repeat("ab", 3)"ababab"

Cuidado: strlen cuenta bytes. Con tildes y eñes usa las funciones mb_.

Más en: Cadenas

Arrays

Código ($n = [5, 3, 8])Resultado
$n[0]5
$n[] = 1;Añade al final
count($n)3
array_push($n, 7, 9)Añade varios al final
array_pop($n)Quita y devuelve el último
array_shift($n)Quita y devuelve el primero
array_unshift($n, 0)Añade al principio
in_array(3, $n, true)true (con true compara estricto)
array_search(8, $n)2 (posición, o false)
array_slice($n, 1, 2)[3, 8]
[...$n, 1]Copia y amplía con spread
[$a, $b] = [1, 2];Desestructura
$ed = ["Ana" => 34];Array asociativo
$ed["Luis"] = 22;Añade o cambia
$ed["Zoe"] ?? 00 (valor por defecto)
array_key_exists("Ana", $ed)true
array_keys($ed) / array_values($ed)Claves / valores
unset($ed["Ana"]);Borra una clave
$m[1][0]Elemento de un array anidado

Más en: Arrays

Funciones de arrays

CódigoResultado
array_map(fn($n) => $n * 2, [1, 2, 3])[2, 4, 6]
array_filter([1, 2, 3, 4], fn($n) => $n % 2 === 0)[1 => 2, 3 => 4] (conserva claves)
array_values(array_filter(...))Reindexa: [2, 4]
array_reduce([1, 2, 3], fn($a, $n) => $a + $n, 0)6
array_sum([1, 2, 3])6
max([4, 9, 2]) / min([4, 9, 2])9 / 2
array_unique([1, 2, 2, 3])[0 => 1, 1 => 2, 3 => 3]
array_merge([1], [2, 3])[1, 2, 3]
array_column($filas, "nombre")Lista con esa columna de cada fila
array_combine(["a", "b"], [1, 2])["a" => 1, "b" => 2]
array_reverse([1, 2, 3])[3, 2, 1]
range(1, 5)[1, 2, 3, 4, 5]
array_find($n, fn($x) => $x > 4)Primer elemento que cumple (PHP 8.4)
array_any($n, fn($x) => $x > 4)true si alguno cumple (PHP 8.4)
array_all($n, fn($x) => $x > 0)true si todos cumplen (PHP 8.4)
sort($n) / rsort($n)Ordena el propio array (menor a mayor / al revés)
asort($ed) / ksort($ed)Ordena por valor / por clave, conservando pares
usort($n, fn($a, $b) => $a <=> $b)Ordena con tu propio criterio

Más en: Funciones de arrays

Condicionales y match

if ($nota >= 9) {
    echo "Sobresaliente";
} elseif ($nota >= 5) {
    echo "Aprobado";
} else {
    echo "Suspenso";
}

$texto = match (true) {
    $nota >= 9 => "Sobresaliente",
    $nota >= 5 => "Aprobado",
    default    => "Suspenso",
};
CódigoQué hace
match ($dia) { 1, 7 => "finde", default => "semana" }Devuelve un valor; compara con ===
match sin defaultLanza UnhandledMatchError si nada coincide
switch ($x) { case 1: ...; break; }Forma clásica (necesita break)
$x ?: "vacío"Operador Elvis: usa el valor si es truthy

Más en: Condicionales

Bucles

CódigoQué hace
for ($i = 0; $i < 5; $i++) { ... }Repite con contador (0 a 4)
while ($i < 5) { ... }Repite mientras se cumpla
do { ... } while ($i < 5);Se ejecuta al menos una vez
foreach ($lista as $x) { ... }Recorre los valores
foreach ($ed as $nombre => $edad) { ... }Recorre claves y valores
foreach ($lista as &$x)Modifica cada elemento (acaba con unset($x);)
breakSale del bucle
continueSalta a la siguiente vuelta
foreach ($filas as ["id" => $id])Desestructura en el bucle
$notas = [4, 8, 6];
$suma = 0;
foreach ($notas as $nota) {
    $suma += $nota;
}
echo $suma / count($notas); // 6

Más en: Bucles

Funciones con tipos

function precioFinal(float $precio, float $iva = 0.21): float
{
    return round($precio * (1 + $iva), 2);
}

echo precioFinal(100);              // 121
echo precioFinal(100, iva: 0.10);   // 110
CódigoQué hace
function f(int $a): intTipo de parámetro y de retorno
function f(): voidNo devuelve nada
function f(?string $x)Acepta string o null
function f(int|string $x)Acepta uno de varios tipos
function f(): neverNunca termina (lanza o hace exit)
function f(int ...$nums)Recibe cualquier número de argumentos
f(...$lista)Desempaqueta un array al llamar
f(iva: 0.1)Argumento con nombre
fn($x) => $x * 2Función flecha (hereda variables de fuera)
function ($x) use ($y) { ... }Función anónima con variable de fuera
static $contador = 0;Variable que conserva su valor entre llamadas
declare(strict_types=1);Primera línea: no convierte tipos solo

Consejo: pon siempre tipos y strict_types. Los errores aparecen antes y con mensajes claros.

Más en: Funciones

include y require

CódigoQué hace
require "config.php";Incluye el archivo; si falta, error fatal
require_once "config.php";Igual, pero solo una vez
include "cabecera.php";Incluye el archivo; si falta, solo un aviso
include_once "pie.php";Igual, pero solo una vez
require __DIR__ . "/lib/util.php";Ruta segura desde la carpeta actual
$datos = require "config.php";Recoge el return del archivo
require "vendor/autoload.php";Carga las clases de Composer
// config.php
return ['host' => 'localhost', 'bd' => 'tienda'];

// index.php
$config = require __DIR__ . '/config.php';
echo $config['bd']; // tienda

Más en: include y require · Composer

Formularios y validación

<?php
$errores = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email'] ?? '');
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errores[] = 'Correo no válido';
    }
}
?>
<form method="post">
    <input name="email" value="<?= htmlspecialchars($email ?? '') ?>">
    <button>Enviar</button>
</form>
CódigoQué hace
$_POST['campo'] ?? ''Dato enviado por POST (siempre texto)
$_GET['q'] ?? ''Dato de la URL: ?q=php
$_SERVER['REQUEST_METHOD']"GET" o "POST"
$_FILES['foto']Datos de un archivo subido
htmlspecialchars($texto)Convierte < y > en entidades: evita XSS al mostrar
trim($_POST['nombre'] ?? '')Quita espacios sobrantes
filter_var($e, FILTER_VALIDATE_EMAIL)Devuelve el correo o false
filter_var($n, FILTER_VALIDATE_INT)Devuelve el entero o false
filter_input(INPUT_POST, "edad", FILTER_VALIDATE_INT)Lee y valida a la vez
header("Location: gracias.php"); exit;Redirige tras guardar

Cuidado: valida siempre en el servidor. Lo que se comprueba en el navegador se puede saltar.

Más en: Formularios · Validar formularios · Seguridad

Sesiones y cookies

CódigoQué hace
session_start();Inicia o recupera la sesión (antes de cualquier salida)
$_SESSION['usuario'] = "Ana";Guarda un dato en la sesión
$_SESSION['usuario'] ?? nullLee un dato, o null si no existe
unset($_SESSION['usuario']);Borra un dato
session_regenerate_id(true);Cambia el id al iniciar sesión (evita fijación)
session_destroy();Destruye la sesión (cerrar sesión)
setcookie("tema", "oscuro", time() + 3600);Crea una cookie de una hora
$_COOKIE['tema'] ?? 'claro'Lee una cookie
setcookie("tema", "", time() - 3600);Borra una cookie
setcookie('recordar', '1', [
    'expires'  => time() + 86400,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

Más en: Sesiones y cookies

Clases y excepciones

class Cuenta
{
    public function __construct(
        public readonly string $titular,
        private float $saldo = 0,
    ) {}

    public function ingresar(float $cantidad): void
    {
        if ($cantidad <= 0) {
            throw new InvalidArgumentException("Cantidad no válida");
        }
        $this->saldo += $cantidad;
    }

    public function saldo(): float
    {
        return $this->saldo;
    }
}

try {
    $c = new Cuenta("Ana", 100);
    $c->ingresar(-5);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(); // Cantidad no válida
} finally {
    echo " (fin)";
}
CódigoQué hace
new Cuenta("Ana")Crea un objeto
$c->ingresar(50)Llama a un método
public / protected / privateVisibilidad
public readonly string $idSe asigna una vez y no cambia
public private(set) float $saldoSe lee desde fuera, se escribe solo dentro (PHP 8.4)
public string $nombre { get => ucfirst($this->n); }Propiedad con hook (PHP 8.4)
static function crear() / self::crear()Método de clase
const MAX = 10; → Cuenta::MAXConstante de clase
class Ahorro extends CuentaHerencia
parent::__construct($t)Llama al constructor del padre
interface Pagable { ... } / implementsContrato que la clase debe cumplir
enum Estado: string { case Activo = "a"; }Enumeración
$x instanceof Cuentatrue si es de esa clase
throw new Exception("Fallo");Lanza una excepción
catch (TypeError | ValueError $e)Captura varias
$e->getMessage() / getCode()Texto y código del error
class SaldoError extends Exception {}Excepción propia

Más en: Clases · Herencia e interfaces · Excepciones

PDO, contraseñas y JSON

$pdo = new PDO(
    'mysql:host=localhost;dbname=tienda;charset=utf8mb4',
    'usuario',
    'clave',
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);

$stmt = $pdo->prepare('SELECT * FROM productos WHERE precio < :max');
$stmt->execute(['max' => 20]);
$productos = $stmt->fetchAll();
CódigoQué hace
$pdo->prepare("... WHERE id = ?")Consulta preparada (evita inyección SQL)
$stmt->execute([$id])Ejecuta con los valores
$stmt->fetch()Una fila (o false)
$stmt->fetchAll()Todas las filas
$stmt->rowCount()Filas afectadas
$pdo->lastInsertId()Id del último INSERT
$pdo->beginTransaction() / commit() / rollBack()Transacción
password_hash($clave, PASSWORD_DEFAULT)Genera el hash para guardar
password_verify($clave, $hash)true si coincide
json_encode($datos, JSON_UNESCAPED_UNICODE)Array a texto JSON
json_decode($texto, true)Texto JSON a array
json_decode($t, true, 512, JSON_THROW_ON_ERROR)Lanza excepción si el JSON es inválido
header('Content-Type: application/json');Responde JSON desde un script
file_get_contents("php://input")Cuerpo crudo de la petición

Cuidado: nunca pegues variables dentro del SQL ("... WHERE id = $id"). Usa siempre consultas preparadas.

Más en: PDO · CRUD · Seguridad · JSON y APIs

PHP · devschool.es/chuletas/php/