Programación · Lenguajes de programación
Tutorial de PHP para principiantes
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.
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:8000En 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.
| Tipo | Ejemplo | Notas |
|---|---|---|
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"; // weekendmatch (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"; // 6Caracterí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 yesLos 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"; // ViewerLa 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
md5osha1. Usapassword_hashypassword_verify. - Usar
strlencon texto UTF-8; cuenta bytes. Usamb_strlenpara 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.