cv.cm

Programación · Lenguajes de programación

Tutorial de PHP para principiantes

6 min de lectura

Respuesta corta

PHP es un lenguaje de scripting del lado del servidor creado para la web: un archivo PHP se ejecuta en el servidor y envía HTML o JSON al navegador. Instala PHP, guarda <?php echo "Hello, world"; como hello.php y ejecuta php hello.php, o inicia un servidor local con php -S localhost:8000. Las ideas centrales son las variables con $, los arrays flexibles, las funciones con declaraciones de tipo, las clases, las excepciones y el tratamiento seguro de los datos del usuario.

Abrir Formateador JSON

Qué es PHP y para qué se usa

PHP fue creado por Rasmus Lerdorf en 1994; hoy el nombre significa «PHP: Hypertext Preprocessor». Funciona en casi todos los hostings web y mueve una gran parte de los sitios, entre ellos WordPress, Drupal y MediaWiki, de Wikipedia. Los desarrolladores lo usan para sitios de contenido, tiendas online, APIs REST y aplicaciones web completas con frameworks como Laravel y Symfony. El PHP 8 moderno tiene un sistema de tipos, un compilador JIT, enums, atributos y un rendimiento mucho mejor que las versiones antiguas.

Instalar PHP y ejecutar Hello, world

Instala PHP desde php.net o con un gestor de paquetes (brew install php, sudo apt install php-cli, o un paquete como XAMPP en Windows). Compruébalo con php -v. El código PHP va entre <?php y una etiqueta de cierre ?> opcional.

<?php
echo "Hello, world\n";
php hello.php
# Hello, world
php -S localhost:8000    # serve the current folder at http://localhost:8000

En los archivos que solo contienen código PHP, omite la etiqueta de cierre ?>, para que no se envíe al navegador por accidente ningún espacio en blanco sobrante.

Variables y tipos básicos

Los nombres de variable empiezan con $. Los tipos son dinámicos, pero puedes declarar los tipos de parámetros y de retorno, y declare(strict_types=1); al principio de un archivo impide las conversiones automáticas en las llamadas a funciones.

TipoEjemploNotas
int$n = 42;64 bits en la mayoría de los sistemas
float$x = 3.14;Doble precisión
string$s = "hi $name";Las comillas dobles interpolan, las simples no
bool$ok = true;Palabra clave que no distingue mayúsculas
array$a = [1, 2];Mapa ordenado: lista y diccionario en uno
null$v = null;Sin valor
<?php
$name = "Ada";
$count = 7;
echo "$name has $count items\n";        // Ada has 7 items
echo 'No $interpolation here' . "\n";   // No $interpolation here
echo intdiv($count, 2), " ", $count / 2, "\n";  // 3 3.5
var_dump((int) "12" + 1);                // int(13)

El operador . une cadenas; + es solo para números.

Control de flujo

<?php
$score = 72;
if ($score >= 90) {
    echo "A\n";
} elseif ($score >= 70) {
    echo "B\n";                   // B
} else {
    echo "C\n";
}

for ($i = 0; $i < 3; $i++) {
    echo $i, " ";                 // 0 1 2
}
echo "\n";

foreach (["apple", "pear"] as $fruit) {
    echo $fruit, "\n";
}

$kind = match ($day = "SAT") {   // match is strict and returns a value
    "SAT", "SUN" => "weekend",
    default => "weekday",
};
echo $kind, "\n";                 // weekend

match (PHP 8.0 y posteriores) compara con === y lanza un error cuando ninguna rama coincide, a diferencia del antiguo switch, que compara de forma laxa y continúa en la siguiente rama sin break.

Funciones

<?php
declare(strict_types=1);

function greet(string $name, string $greeting = "Hello"): string
{
    return "$greeting, $name!";
}

echo greet("Lin"), "\n";                    // Hello, Lin!
echo greet(greeting: "Hi", name: "Lin"), "\n"; // Hi, Lin!  (named arguments)

$square = fn(int $x): int => $x * $x;       // arrow function
echo $square(5), "\n";                      // 25

function total(int ...$nums): int           // variadic
{
    return array_sum($nums);
}
echo total(1, 2, 3), "\n";                  // 6

Característica distintiva: los arrays

El array de PHP es un único tipo flexible que sirve como lista, diccionario, pila o cola. Las claves son enteros o cadenas, y se conserva el orden de inserción. Un gran conjunto de funciones integradas trabaja con arrays.

<?php
$nums = [3, 1, 2];
$nums[] = 5;                       // append
sort($nums);
echo implode(", ", $nums), "\n";   // 1, 2, 3, 5

$ages = ["ann" => 31, "bob" => 25];
$ages["cy"] = 40;
foreach ($ages as $person => $age) {
    echo "$person is $age\n";
}
echo $ages["zed"] ?? 0, "\n";      // 0  (null coalescing)

$evens = array_filter($nums, fn($n) => $n % 2 === 0);
$squares = array_map(fn($n) => $n * $n, $nums);
echo json_encode(array_values($evens)), " ", json_encode($squares), "\n";  // [2] [1,4,9,25]
echo count($ages), " ", array_key_exists("bob", $ages) ? "yes" : "no", "\n"; // 3 yes

Los arrays se copian al asignarlos (copy-on-write), a diferencia de los objetos, que se pasan por identificador.

Clases, promoción de constructor y enums

<?php
declare(strict_types=1);

enum Role: string
{
    case Admin = "admin";
    case Viewer = "viewer";
}

final class User
{
    public function __construct(
        public readonly string $name,
        public readonly Role $role = Role::Viewer,
    ) {}

    public function label(): string
    {
        return "{$this->name} ({$this->role->value})";
    }
}

$u = new User("Ann", Role::Admin);
echo $u->label(), "\n";               // Ann (admin)
echo Role::from("viewer")->name, "\n"; // Viewer

La promoción de constructor (PHP 8.0) declara y asigna propiedades en la firma del constructor. Las propiedades readonly (8.1) pueden asignarse una sola vez, y los enums con valor (8.1) asocian casos con cadenas o enteros. También hay interfaces, clases abstractas y traits.

Manejo de errores

El PHP moderno lanza excepciones en la mayoría de los errores. Captura las subclases de Exception para los fallos esperados; Throwable también cubre los errores del motor como TypeError.

<?php
function parseAge(string $text): int
{
    if (!ctype_digit($text)) {
        throw new InvalidArgumentException("invalid age: $text");
    }
    return (int) $text;
}

try {
    echo parseAge("41"), "\n";   // 41
    echo parseAge("abc"), "\n";
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(), "\n"; // invalid age: abc
} finally {
    echo "done\n";
}

Un programa completo pequeño: un endpoint de API JSON

Guárdalo como api.php, ejecuta php -S localhost:8000 y abre http://localhost:8000/api.php?name=Ann. Lee un parámetro de la consulta, lo valida y devuelve JSON.

<?php
declare(strict_types=1);

header("Content-Type: application/json; charset=utf-8");

$name = trim($_GET["name"] ?? "");
if ($name === "" || mb_strlen($name) > 50) {
    http_response_code(400);
    echo json_encode(["error" => "name must be 1 to 50 characters"]);
    exit;
}

$response = [
    "message" => "Hello, $name!",
    "length" => mb_strlen($name),
    "time" => date(DATE_ATOM),
];
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

$_GET, $_POST y $_COOKIE contienen los datos de la petición. Trata todos sus valores como no confiables.

Errores comunes de principiantes

  • Comparar con ==, que convierte los tipos; usa === y !==.
  • Olvidar el $ en el nombre de una variable, o el punto y coma al final de una instrucción.
  • Guardar contraseñas con md5 o sha1. Usa password_hash y password_verify.
  • Usar strlen con texto UTF-8; cuenta bytes. Usa mb_strlen para contar caracteres.
  • Usar una versión antigua de PHP. Usa una versión de PHP 8 con soporte para tener correcciones de seguridad y características modernas.

Adónde ir después

El Manual oficial de PHP en php.net documenta cada función, con una referencia del lenguaje y notas de usuarios. Aprende Composer, el gestor de paquetes, y los estándares de código PSR; después prueba un framework: Laravel o Symfony para aplicaciones, o Slim para APIs pequeñas. PHPUnit es la herramienta de pruebas estándar.

Preguntas frecuentes

¿Sigue valiendo la pena aprender PHP?

Sí. Mueve buena parte de la web, incluidos los sitios WordPress, y el PHP 8 moderno con Laravel o Symfony es una forma productiva de crear aplicaciones web. Hay muchos empleos de mantenimiento y desarrollo de sistemas PHP.

¿PHP es un lenguaje de frontend o de backend?

De backend. PHP se ejecuta en el servidor y envía al navegador el HTML, JSON o los archivos ya terminados; el navegador nunca ve el código PHP.

¿Cuál es la diferencia entre echo y print?

Ambos muestran texto. echo puede recibir varios argumentos separados por comas y no devuelve nada; print recibe un argumento y devuelve 1. En la práctica, la mayoría del código usa echo.

¿Qué hace declare(strict_types=1)?

Hace estrictas las declaraciones de tipo escalar para las llamadas a funciones hechas desde ese archivo, de modo que pasar la cadena "5" a un parámetro int lanza un TypeError en lugar de convertirse.

Todos los tutoriales de programación