Aprender PHP: tutorial de PHP para principiantes
PHP es uno de los lenguajes de programación más utilizados para la programación del lado del servidor. Con el tiempo, PHP se ha convertido en una pieza fundamental de muchas páginas web modernas y de numerosas tecnologías de Internet. Sin embargo, aprender PHP puede suponer un desafío para quienes empiezan desde cero. En este tutorial de PHP te mostramos los fundamentos de este popular lenguaje de programación, así como sus operadores, bucles y funciones más importantes.
Resumen
- Para ejecutar los ejemplos necesitas un servidor web con intérprete de PHP, por ejemplo, mediante XAMPP, el servidor integrado de PHP o Docker.
- Los fundamentos de PHP incluyen la sintaxis,
echo, las variables, el tipado estricto, los operadores de concatenación y el cálculo con variables. - Con las superglobales
$_GETy$_POSTtransmites datos; conif,matchy los bucles controlas el flujo del programa. - Otros apartados tratan las operaciones con archivos, la programación orientada a objetos y el código limpio con Composer y namespaces.
- Para terminar, el tutorial presenta un ejemplo de PDO para bases de datos y medidas de protección como los prepared statements, el escape de salida (output escaping) y el hash de contraseñas.
Tutorial de PHP: qué necesitas para empezar
Este tutorial de PHP está dirigido principalmente a personas que comienzan desde cero. Sin embargo, para algunos ejemplos es útil contar con conocimientos básicos de desarrollo web moderno y de HTML. Para poder seguir los ejemplos en tu propio ordenador, necesitas preparar lo siguiente:
- Servidor web con intérprete de PHP
- Instalar PHP
- Navegador web
- Editor de texto
XAMPP
Como servidor para empezar te recomendamos el entorno de pruebas local XAMPP, que Apache Friends ofrece de forma gratuita para los sistemas operativos Windows, Linux y macOS. XAMPP es un servidor pensado únicamente para pruebas. El paquete de software permite a los desarrolladores web configurar en muy poco tiempo un entorno completo de prueba para scripts, páginas HTML y hojas de estilo. Sin embargo, no está diseñado para funcionar de forma segura como servidor web en Internet. Encontrarás una guía de instalación detallada en nuestro tutorial de XAMPP.
- 3 veces más rápido y un 60 % más barato
- Máxima disponibilidad con > 99,99
- Sólo con IONOS: hasta 500 GB de espacio de almacenamiento incluido
Servidor integrado de PHP
Desde la versión 5.4, PHP incorpora un servidor de desarrollo integrado que resulta especialmente adecuado para pruebas sencillas y para aprender PHP. Este llamado servidor integrado no requiere software de servidor adicional como Apache o NGINX. El único requisito es tener una versión de PHP instalada en tu sistema. Después, puedes iniciar el servidor directamente desde la línea de comandos en el directorio del proyecto:
php -S localhost:8000bashPHP pone a disposición los archivos de la carpeta actual en el navegador web en la dirección http://localhost:8000. El servidor integrado es adecuado para los primeros experimentos con PHP, pequeños scripts de prueba o para reproducir rápidamente ejemplos de código.
Docker y Docker Compose
Una alternativa algo más avanzada es el uso de Docker. Docker permite encapsular entornos de desarrollo en contenedores. De este modo, el servidor web, PHP y las bases de datos pueden configurarse exactamente igual que después funcionarán en el entorno de producción.
Para proyectos PHP se utiliza a menudo Docker Compose, que permite iniciar varios servicios conjuntamente. Toda la configuración se recoge en un archivo (“docker-compose.yml”) y se puede iniciar con un único comando.
Fundamentos de PHP: la sintaxis del lenguaje de scripts
Si ya has configurado tu servidor web local (por ejemplo, con ayuda de XAMPP), deberías comprobar si PHP se ha instalado correctamente y está listo para ejecutar scripts. Un script es un programa que no se compila previamente a código binario. En su lugar, lo ejecuta un intérprete. Abre tu editor de texto preferido y copia el siguiente script de PHP:
<?php
phpinfo();
?>phpLos scripts de PHP siguen siempre el mismo esquema. La etiqueta de apertura de PHP <?php indica que comienza un entorno de script. A continuación aparece el propio código PHP en forma de instrucciones. En el ejemplo, se trata de la llamada a la función phpinfo().
La mayoría de las funciones de PHP necesitan uno o varios parámetros, que se colocan entre paréntesis; en phpinfo() son opcionales. Cada instrucción termina con un punto y coma (;). Para cerrar el entorno de script se utiliza la etiqueta de cierre de PHP: ?>. En los archivos que contienen únicamente PHP, esta etiqueta es opcional.
Guarda el archivo de texto con el nombre “test” en formato .php (script de PHP) e inicia tu servidor web. Si utilizas el entorno de pruebas XAMPP, coloca “test.php” en el directorio de XAMPP dentro de “htdocs” (C:\xampp\htdocs).

El archivo de ejemplo puede abrirse ahora en el navegador web mediante la siguiente URL: http://localhost/test.php. Si utilizas otro servidor web o una configuración personalizada de XAMPP, elige la URL correspondiente a la ruta de acceso del archivo.
Al introducir la URL http://localhost/test.php le indicas a tu navegador web que solicite el archivo “test.php” al servidor web. El Apache HTTP Server o el software de servidor web que prefieras recupera el archivo del directorio correspondiente.
La extensión .php indica que el archivo contiene código PHP. Entonces entra en juego el intérprete de PHP integrado en el servidor web. Este analiza el documento y encuentra la etiqueta de apertura de PHP <?php. El intérprete ejecuta el código PHP y genera una salida HTML, que el servidor web entrega finalmente al navegador.
La función phpinfo() es la forma abreviada del valor estándar phpinfo(INFO_ALL). Esta muestra información detallada sobre la configuración de PHP de tu servidor web. Si no se encuentra ninguna versión de PHP, el navegador web mostrará un mensaje de error o entregará el código PHP al navegador sin interpretarlo.
“Hello World!”: así muestras texto con echo
Si PHP se ha instalado sin errores, ha llegado el momento de escribir tu primer script propio. Para ello, la instrucción PHP echo resulta especialmente adecuada. A diferencia de phpinfo(), echo no es una función. Se trata más bien de una construcción del lenguaje que permite mostrar como texto una cadena (string) que aparece a continuación.
Los constructos del lenguaje son instrucciones que se utilizan en PHP para controlar el flujo del programa. Además de echo, entre ellas se encuentran instrucciones como if, for, do, include, return, exit o die. Por ello, a diferencia de las funciones, en este caso no es necesario usar paréntesis.
Crea un nuevo archivo PHP para tu primer script y escribe en él el siguiente código:
<?php
echo 'Hello World!';phpLa etiqueta de apertura <?php inicia un entorno de script. A continuación aparece la construcción del lenguaje echo y la cadena “Hello World!” entre comillas simples. Fíjate en el punto y coma al final de la instrucción. En lugar de “Hello World!” puedes usar cualquier texto. Como se trata de un archivo que contiene solo PHP, hemos omitido la etiqueta de cierre.
La etiqueta de cierre de PHP ?> no es necesaria en archivos que contienen únicamente PHP. De este modo se evitan líneas en blanco accidentales o caracteres invisibles al final del archivo, que pueden provocar mensajes de error como “Headers already sent”.
Guarda el script como “hello.php” en la carpeta “htdocs” de tu servidor web y abre el archivo en el navegador web mediante la URL http://localhost/hello.php. Si el código se ha transferido correctamente, la ventana del navegador debería mostrar ahora la cadena de caracteres que hayas utilizado:

Todo texto que muestres con echo puede etiquetarse, si lo necesitas, con etiquetas HTML. El navegador las interpretará después según la especificación HTML. Pruébalo tú mismo, por ejemplo con el siguiente script:
<?php
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';phpAl abrirlo en el navegador web, el resultado de la ejecución del script se mostrará de la siguiente manera:

La cadena de caracteres “Hello World!” entre etiquetas <h1> es interpretada por el navegador como un encabezado de primer nivel. A continuación se produce un salto de línea automático y el párrafo de texto <p>.
Según lo que necesites, puedes usar echo tanto con comillas simples (') como con comillas dobles ("). Si solo quieres mostrar texto, no hay diferencia entre el tipo de comillas que elijas. Sin embargo, esto cambia en cuanto entran en juego las variables de PHP.
Variables
El constructo del lenguaje echo ofrece más que la simple salida de texto. Al fin y al cabo, esto también se puede hacer perfectamente sin PHP, solo con HTML. El verdadero valor añadido de echo radica en que la instrucción permite generar textos de forma dinámica con la ayuda de variables.
Las variables pueden presentarse, por ejemplo, de la siguiente forma: $example.
Cada variable consta de un signo de dólar ($) seguido del nombre de la variable. Las variables se utilizan en scripts PHP para integrar datos externos en páginas web. Estos valores pueden ser de distintos tipos: desde números simples y cadenas de caracteres hasta textos completos o estructuras de documentos HTML.
PHP distingue ocho tipos de variables:
| Tipo de variable | Descripción |
|---|---|
| String | Un string es una cadena de caracteres. Puede tratarse de una palabra, una frase, un texto o todo el código HTML de una página web. |
| Integer | Un integer es un número entero sin decimales. Puede ser positivo o negativo. |
| Float | Un float es un número de coma flotante, es decir, un valor numérico con decimales. En los lenguajes de programación, la coma se escribe como punto (.). La precisión es de unas 14 cifras significativas; se cuentan todos los dígitos, no solo los que van después de la coma. |
| Boolean | Las variables booleanas son el resultado de una operación lógica y solo pueden tener dos valores: TRUE (verdadero) y FALSE (falso). Este tipo de variable se utiliza, por ejemplo, cuando trabajas con condiciones. |
| Array | Un array es una variable que puede contener varios elementos. Se trata, por tanto, de una agrupación de varios datos con una estructura similar dentro de una misma variable. |
| Object | El tipo de variable object permite a los programadores definir sus propios tipos de datos. Se utiliza en la programación orientada a objetos. En este tutorial de PHP para principiantes no abordaremos las variables de tipo object. |
| NULL | El valor NULL representa una variable sin valor. Este es el único valor posible para las variables de tipo NULL. |
| Resource | Una resource es una variable especial que contiene una referencia a recursos externos, por ejemplo, un archivo abierto, una conexión de base de datos o un socket. Las resources son gestionadas por el propio PHP. En este tutorial de PHP para principiantes tampoco abordaremos las variables de tipo resource. |
La gestión centralizada de contenidos suele realizarse con sistemas de bases de datos. Sin embargo, los valores de las variables también pueden definirse directamente en el script. Este tipo de asignación sigue el siguiente esquema:
$example = "value";phpTras el signo de dólar aparece el nombre de la variable (en este caso example). Este se vincula mediante el signo igual (=) con un valor entre comillas dobles. Los valores de las variables de tipo integer y float se escriben sin comillas (por ejemplo, $example = 24; o $example = 2.7;).
PHP te da la libertad de nombrar las variables como quieras. Sin embargo, se aplican las siguientes restricciones:
- Cada variable comienza con un signo de dólar.
- Un nombre de variable puede contener letras, dígitos y guiones bajos (por ejemplo,
$example_1). - Un nombre de variable válido siempre empieza por una letra o un guion bajo (
$example1o$_example), nunca por un dígito (incorrecto:$1example). - PHP es case-sensitive. El lenguaje de script distingue entre mayúsculas y minúsculas (
$example≠$Example). - El nombre de la variable no puede contener espacios en blanco ni saltos de línea (incorrecto:
$example 1). - Las palabras reservadas por PHP no se pueden usar como nombres de variables (por ejemplo,
$this).
Veámoslo con un ejemplo:
<?php
$author = "John Doe";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>";phpTras la etiqueta de apertura de PHP sigue la definición de la variable: a $author se le asigna el valor “John Doe”. Al ejecutar el script, la variable $author se sustituye en cada aparición dentro del entorno del script por el valor correspondiente. La siguiente imagen muestra cómo se ve esto en el navegador:

Si ahora resulta que se ha cometido un error y la página web no es de John Doe, sino de su compañero alemán Max Mustermann, solo hace falta ajustar la variable llamada $author para corregirlo. Esto es especialmente útil cuando una variable aparece varias veces dentro de un script. En ese caso, la corrección solo hay que hacerla en un único lugar: donde se define el valor de la variable.
Las ventajas de este concepto de diseño son evidentes: si se revisan elementos de la página web (por ejemplo, en el pie de página), no es necesario aplicar los cambios manualmente en cada subpágina del proyecto web. En su lugar, basta con actualizar el valor correspondiente en la base de datos. De este modo, la modificación se aplica automáticamente a todas las páginas web que utilizan esos datos como variables.
Si defines una variable varias veces dentro de un script, la nueva definición sobrescribe la anterior. Un echo posterior siempre muestra el valor actual de la variable.
<?php
$author = "John Doe";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>";
$author = "Max Mustermann";
echo "<p>Supported by $author.</p>";phpEn el ejemplo de código, primero se asigna a la variable $author el valor “John Doe” y después se sustituye por el valor “Max Mustermann”.

Pasemos ahora al tema de las comillas. A diferencia de las cadenas (strings), las variables individuales no necesitan ponerse entre comillas:
<?php
$author = "John Doe";
echo $author;phpEsto cambia cuando la variable se utiliza dentro de una cadena. En ese caso se emplean comillas dobles (“). Estas le indican al intérprete de PHP que debe buscar variables dentro del string para sustituirlas, si procede, por los valores que tengan asociados. Las cadenas que van entre comillas simples (’) se interpretan y se muestran como texto literal, incluso cuando contienen variables.
<?php
$author = "John Doe";
echo '<h1>Hello World!</h1>
<p>This dynamic web page was created by $author.</p>';phpEn este caso, la variable no se interpreta, sino que simplemente se muestra como texto.

Quizá te preguntes ahora qué pasa si omites por completo las comillas. En ese caso, PHP te indicará que se ha producido un error de sintaxis.
Tipado estricto con declare(strict_types=1)
De forma predeterminada, PHP intenta convertir automáticamente distintos tipos de datos entre sí. A este comportamiento se le suele llamar “type juggling” y puede provocar que valores incorrectos sigan procesándose sin que te des cuenta.
Con la directiva declare(strict_types=1); puedes desactivar expresamente este comportamiento. PHP comprobará entonces de forma estricta, en las llamadas a funciones, si los argumentos pasados y los valores de retorno coinciden con los tipos de datos declarados. La directiva debe estar al principio de un archivo PHP y solo afecta a ese archivo:
<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
return $a + $b;
}
echo add(2, 3);
echo add("2", 3);phpEn el ejemplo, una función de PHP llamada add() acepta exclusivamente valores enteros (integer). Mientras que la llamada con 2 y 3 funciona sin problema, la segunda llamada provoca un error, ya que la cadena "2" no se convierte automáticamente en un número entero. Gracias al tipado estricto, este tipo de problemas se detecta de forma temprana, lo que mejora considerablemente el mantenimiento y la fiabilidad del código PHP.
Mensajes de error y escape de caracteres
Si se producen errores de sintaxis, el código PHP deja de ser válido y la página cargada en el navegador puede aparecer en blanco o el intérprete de PHP mostrar un mensaje de error. Esto ocurre, por ejemplo, cuando se utiliza la instrucción echo con una cadena (string) sin comillas:
<?php
echo Hello World!;phpLos mensajes de error suelen incluir información sobre dónde se ha producido el fallo y ayudan a localizar el problema rápidamente. En cualquier caso, también puedes consultar los mensajes en el registro (log) de XAMPP en C:\xampp\logs\php_error_log.

En este ejemplo, el mensaje indica que probablemente hay un error en la línea 2 del código, justo donde hemos omitido las comillas a propósito para fines de demostración.
También se producen errores de sintaxis cuando intentas mostrar como texto caracteres que en PHP tienen un significado especial. Un ejemplo sería la comilla simple (’). Solo puedes mostrar este tipo de caracteres como texto si indicas al intérprete que ese carácter debe interpretarse literalmente. En el caso de las comillas simples, tienes dos opciones: puedes encerrar la cadena entre comillas dobles o utilizar una barra invertida (backslash) para escapar el carácter:
<?php
echo '\'Hello World!\' ';php
También es posible combinar comillas simples y dobles:
<?php
echo " 'Hello World!' ";phpEn cambio, esta forma de escritura provoca un error:
<?php
echo ' 'Hello World!' ';phpEn los ejemplos se han añadido espacios entre las comillas únicamente para facilitar la lectura.
Operadores de concatenación
Si quieres mostrar varias variables a la vez dentro de un script de PHP, puedes hacerlo de la forma que has aprendido hasta ahora:
<?php
$author1 = "John Doe";
$author2 = "Max Mustermann";
echo "<h1>Hello World!</h1>
<p>This dynamic web page was created by $author1 and $author2.</p>";phpSolo tienes que escribir ambas variables junto con el resto del texto dentro de una cadena entre comillas dobles. PHP reconoce automáticamente las variables por el signo de dólar ($) y sustituye los valores correspondientes.

Entre los desarrolladores, este enfoque no se considera muy limpio. Se sigue la recomendación de que las variables no formen parte directamente del string. Una razón es que muchos lenguajes de programación exigen esta separación. Además, PHP también recomienda separar strings y variables cuando se trabaja con llamadas a funciones o con variables más complejas. Por eso conviene aplicar esta separación también en la salida de texto, incluso cuando en este caso no sea estrictamente necesario.
Cuando trabajamos con variables, solemos manejar varios elementos que deben unirse para generar una salida. En PHP se utiliza para ello el operador de concatenación (.).
El código del ejemplo anterior, escrito de una forma más limpia, tendría el siguiente aspecto:
<?php
$author1 = "John Doe";
$author2 = "Max Mustermann";
echo '<h1>Hello World!</h1>
<p>This dynamic web page was created by ' . $author1 . ' and ' . $author2 . '.</p>';phpEn este caso trabajamos con tres strings y dos variables que se concatenan para formar una única cadena de caracteres.
| String1 | Variable1 | String2 | Variable2 | String3 | ||||
|---|---|---|---|---|---|---|---|---|
| ’<h1>Hello World!</h1><p>This dynamic web page was created by ’ | . | $author1 |
. | ’ and ’ | . | $author2 |
. | ‘.</p>’ |
Ten en cuenta que un operador de concatenación une strings o variables sin añadir espacios automáticamente. Si quieres un espacio, debes escribirlo dentro del string entre comillas, como se muestra en el ejemplo.

Los programadores utilizan el operador de concatenación no solo para enlazar strings y variables en la salida de texto, sino también para ampliar el valor de una variable. Esto se muestra en el siguiente ejemplo:
<?php
$example = 'Hello ';
$example .= 'World';
echo $example;phpPara ampliar el valor de una variable, la defines de nuevo utilizando el operador de concatenación antes del signo igual. Se trata de la forma abreviada habitual de escribir $example = $example . 'World';.
PHP añade el nuevo valor al que ya estaba definido previamente. Si quieres un espacio entre ambos valores, escríbelo, como en el ejemplo, al final del primer string.

Incluir PHP en HTML
El intérprete de PHP solo analiza, en principio, el código que se encuentra entre una etiqueta de apertura y una etiqueta de cierre de PHP (esta última es opcional en archivos que contienen únicamente PHP):
<?php [This area is parsed by the PHP interpreter] ?>
Todas las demás partes del documento son ignoradas por el intérprete y se envían al servidor web tal como están. De este modo, el código PHP puede integrarse libremente en documentos HTML, por ejemplo para crear plantillas en un sistema de gestión de contenidos. Es importante que los documentos HTML que contienen código PHP se guarden como archivos PHP. De lo contrario, el documento no será procesado por el intérprete de PHP, sino que se enviará directamente al navegador web. En ese caso, el código PHP aparecería como texto en la página. Puedes imaginar al intérprete de PHP como el compañero perezoso del servidor web que solo trabaja cuando se le solicita explícitamente, por ejemplo mediante una etiqueta de apertura de PHP.
Si quieres combinar HTML y PHP, escribe tu página HTML como de costumbre siguiendo la estructura clásica del documento y guárdala con la extensión .php:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My first PHP page</title>
</head>
<body>
<h1>Hello World</h1>
<p>What is the current time and date?</p>
</body>
</html>htmlAhora amplía tu documento HTML con un script PHP. Asegúrate de que todo el código del programa esté dentro de las etiquetas PHP.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My first PHP page</title>
</head>
<body>
<h1>Hello World</h1>
<p>What is the current time and date?</p>
<p>Your current time and date is:
<?php
echo date("d.m.Y H:i:s");
?>.</p>
</body>
</html>htmlEn el ejemplo hemos combinado la construcción del lenguaje echo con la función de PHP date() para mostrar en el servidor la fecha actual, incluida la hora, como texto. El parámetro de la función indica el formato deseado en forma de string:
"d.m.Y H:i:s" (día.mes.año hora:minuto:segundo)
Cuando un navegador solicita un archivo de este tipo, el intérprete de PHP ejecuta primero el script y escribe la fecha y la hora actuales en el documento HTML. A continuación, el servidor web entrega el documento, que se muestra en el navegador como una página web.

Comentarios en PHP
Al igual que ocurre con el código HTML, el código PHP también puede comentarse. Los comentarios en el código fuente son ignorados por el intérprete de PHP siempre que estén marcados con la sintaxis correspondiente. Para ello, PHP ofrece tres alternativas.
Si quieres marcar una línea completa como comentario y excluirla de la ejecución del script, puedes utilizar la almohadilla (#) o dos barras inclinadas consecutivas (//). En el siguiente ejemplo de código se muestran ambas posibilidades:
<?php
## This is a single line comment
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';
// This is also a single-line comment!phpLos editores de texto o los entornos de desarrollo (IDE) con resaltado de sintaxis muestran los comentarios con un color diferente. Los fragmentos de texto marcados como comentario dentro del script no llegan al navegador web (a diferencia de los comentarios HTML), ya que el intérprete de PHP los ignora durante la ejecución del código.
También puedes insertar comentarios que se extienden a lo largo de varias líneas. Para ello, marca el inicio de un bloque de comentarios con una barra inclinada seguida de un asterisco (/*) y el final con un asterisco seguido de una barra inclinada (*/).
<?php
/*
This is a multiple-lines comment block
that spans over multiple
lines
*/
echo '<h1>Hello World!</h1>
<p>This is my first PHP page.</p>';phpEstos comentarios tampoco se procesan y, por tanto, no aparecen en la página web.

Los programadores utilizan comentarios para estructurar el código de sus scripts, dejar indicaciones para futuras modificaciones o añadir información interna como la autoría o la fecha de creación. Los comentarios son opcionales y conviene utilizarlos con moderación para mantener una buena legibilidad del código.
Calcular con variables
En este tutorial de PHP ya has trabajado con variables. Hasta ahora, principalmente se les han asignado valores de tipo string (es decir, cadenas de caracteres). Ahora vamos a utilizar variables que representan números enteros (integer) o números de coma flotante (floats).
Si las variables almacenan valores numéricos, PHP permite realizar cálculos con ellas. Empezamos con una suma sencilla de dos números enteros:
<?php
$number1 = 237;
$number2 = 148;
$result = $number1 + $number2;
echo "Result: " . $result;phpPrimero asignamos a las variables $number1 y $number2 los números enteros 237 y 148 y, a continuación, definimos la variable $result. Esta almacena la suma de las dos variables. Para ello, utilizamos el operador aritmético + (suma). Finalmente, mostramos el resultado mediante la construcción del lenguaje echo. Ten en cuenta que, al asignar valores numéricos a variables, no necesitas comillas.

El siguiente ejemplo muestra una selección de operaciones matemáticas que se pueden realizar del lado del servidor con PHP. Los operadores utilizados corresponden en su mayor parte a los símbolos matemáticos habituales.
| Operador aritmético | Operación | Resultado |
|---|---|---|
$number1 + $number2 |
Suma (Addition) | Suma de $number1 y $number2 |
$number1 - $number2 |
Resta (Substraction) | Diferencia entre $number1 y $number2 |
$number1 * $number2 |
Multiplicación (Multiplication) | Producto de $number1 y $number2 |
$number1 / $number2 |
División (Division) | Cociente de $number1 y $number2 |
$number1 ** $number2 |
Potencia (Exponentiation) | $number1 elevado a la $number2 |
<?php
$number1 = 10;
$number2 = 5;
$addition = $number1 + $number2; // Addition
$subtraction = $number1 - $number2; // Subtraction
$multiplication = $number1 * $number2; // Multiplication
$division = $number1 / $number2; // Division
$exponentiation = $number1 ** $number2; // Exponentiation
echo "Result of addition: " . $addition ."<br />";
echo "Result of subtraction: " . $subtraction . "<br />";
echo "Result of multiplication: " . $multiplication . "<br />";
echo "Result of division: " . $division . "<br />";
echo "5th power of 10 (10^5): " . $exponentiation . "<br />";
echo "Square root of 81: " . sqrt(81) . "<br />";phpLa salida tiene el siguiente aspecto:

Para cálculos más complejos, puedes combinar distintas operaciones aritméticas dentro de un script:
<?php
$number1 = 10;
$number2 = 5;
$result = 2 * $number1 + 5 * $number2 - 3 * sqrt(81);
echo "Result: " . $result;phpEl intérprete de PHP evalúa las variables y calcula:
2 * 10 + 5 * 5 - 3 * √81 = 20 + 25 - 27 = 18
La función sqrt() calcula la raíz cuadrada del valor indicado entre paréntesis. PHP sigue el orden de las operaciones matemáticas: primero multiplicaciones y divisiones, luego sumas y restas. La instrucción echo muestra el resultado como cadena para el navegador web.
Los términos entre paréntesis también se evalúan primero. En el siguiente ejemplo trabajamos con números de coma flotante:
<?php
$number1 = 2.5;
$number2 = 3.7;
$result = 2 * ($number1 + 5) * ($number2 - 3) * sqrt(81);
echo "Result: " . $result;php
Como la mayoría de los lenguajes de programación, PHP también admite operadores para incrementar o reducir valores numéricos en 1. Se distinguen cuatro operadores: preincremento, predecremento, postincremento y postdecremento.
| Operación | Operador | Resultado |
|---|---|---|
| Preincremento | ++$number |
El operador ++ incrementa el valor de la variable $number. El valor se aumenta en 1. El resultado se devuelve como nuevo valor de $number. |
| Predecremento | --$number |
El operador -- decrementa el valor de la variable $number. El valor se reduce en 1. El resultado se devuelve como nuevo valor de $number. |
| Postincremento | $number++ |
Primero se devuelve el valor actual de $number y, a continuación, se aumenta en 1. |
| Postdecremento | $number-- |
Primero se devuelve el valor actual de $number y, a continuación, se reduce en 1. |
Mostramos las operaciones aritméticas con operadores de incremento y decremento usando como ejemplo el preincremento. El siguiente script aumenta en 1 el valor de la variable $number, guarda el nuevo valor en la variable $result y, a continuación, muestra su valor como cadena:
<?php
$number = 0;
$result = ++$number;
echo "Result: " . $result;phpSi aumentas el valor 0 en 1, obtienes el resultado 1.

Para calcular el predecremento de la variable $number, usamos el mismo script, pero sustituimos el operador (++) por (--):
<?php
$number = 0;
$result = --$number;
echo "Result: " . $result;phpDecrementamos así el valor 0 de la variable $number y obtenemos el resultado -1.
La diferencia entre preincremento y postincremento puede verse en el siguiente ejemplo:
<?php
$x = 0;
echo '<p>Result: ' . ++$x;
echo '<br>x has the value ' . $x;
echo '<p>Result: ' . $x++;
echo '<br>x has the value ' . $x, '</p>';phpEn ambos casos obtenemos el mismo resultado. En el preincremento, el valor de x se aumenta antes de la salida en la línea 3 y, en el postincremento, después de la salida en la línea 5.

Tipos escalares y Union Types
PHP permite asignar a variables, parámetros de funciones y valores de retorno los llamados tipos escalares. Entre ellos se encuentran int, float, string y bool. Mediante la indicación explícita del tipo se define qué tipo de valores espera y devuelve una función. Esto mejora la legibilidad del código y ayuda a detectar errores típicos en una fase temprana.
<?php
declare(strict_types=1);
function hi(string $name): string {
return "Hello " . $name;
}phpEn este ejemplo, la función hi() que has creado espera una cadena (string) como parámetro y también devuelve una cadena. Si se le pasa un tipo de dato distinto, PHP genera un error. Sin embargo, en algunas situaciones una función debe aceptar más de un tipo de dato. Para ello, PHP ofrece los llamados Union Types. Estos permiten definir varios tipos posibles, separados por el carácter de barra vertical (|):
<?php
declare(strict_types=1);
function formatId(int|string $id): string {
return "ID: " . $id;
}phpLa función formatId() acepta tanto números enteros como cadenas de caracteres como parámetro. No se permiten otros tipos de datos. De este modo, los Union Types permiten definir firmas de función más flexibles sin renunciar al control sobre los tipos de datos.
- Generador de páginas web intuitivo con ayuda de IA
- Crea imágenes y textos cautivadores en segundos
- Dominio, SSL y correo electrónico incluidos
Las superglobales $_GET y $_POST
Ahora ya conoces las bases de PHP: sabes trabajar con variables, concatenarlas y realizar cálculos. A continuación veremos por qué las variables son un concepto fundamental al programar scripts.
Una función importante de los lenguajes de scripting es la posibilidad de procesar entradas de usuario y transferir los valores a otro script. Para la transmisión de datos, PHP utiliza las superglobales $_GET y $_POST, variables de sistema predefinidas que están disponibles en todos los ámbitos de ejecución. Como arrays asociativos, $_GET y $_POST almacenan un conjunto de variables en forma de cadenas (string) en una sola variable.
Puedes imaginar los arrays de PHP como un armario con varios cajones. Cada cajón permite guardar un dato. Para poder identificar qué contiene cada uno, se les asigna una etiqueta. Dependiendo del tipo de array, esta etiqueta puede ser un índice o una clave (key). Mientras que en los arrays indexados cada elemento se identifica mediante un número, en los arrays asociativos cada elemento se identifica mediante una clave en forma de cadena (string).
Las superglobales $_GET y $_POST contienen una serie de variables almacenadas como claves, que permiten acceder a los valores asociados a cada una de ellas. Volveremos sobre ello cuando analicemos con más detalle cómo funcionan las superglobales $_GET y $_POST.
Transmisión de datos mediante $_GET
La superglobal $_GET representa un array de variables que se pasan a un script de PHP mediante una URL.
Si navegas de vez en cuando por blogs, tiendas en línea o foros de Internet, es posible que hayas visto URL con una estructura similar a la siguiente:
http://hostname/folder/filename.php?variablename=variablevalue
Aplicado a un blog, este esquema podría tener el siguiente aspecto:
http://www.example-blog.com/index.php?id=1
Una URL de este tipo se puede desglosar muy fácilmente: en un servidor web con el dominio example-blog.com, hay un archivo llamado index.php que genera una página web dinámica. Este archivo suele contener código HTML y PHP, así como referencias a plantillas externas y hojas de estilo; en resumen, todo lo necesario para mostrar una página web.
Que se trata de una página dinámica lo indica el añadido que aparece después del signo de interrogación (?): id=1. A esto se le llama cadena de consulta de HTTP y contiene una variable (id) y un valor (1), unidos por un signo igual (=). Este tipo de parámetros de URL se utiliza, por ejemplo, para generar páginas web dinámicas, cargar contenidos desde una base de datos o seleccionar una plantilla determinada.
Las páginas web dinámicas permiten una separación entre contenido y presentación. Aunque index.php define la estructura de la página web, los contenidos suelen almacenarse en una base de datos. Estos pueden recuperarse mediante los parámetros de la cadena de consulta HTTP. En nuestro ejemplo, la URL envía a index.php el parámetro id=1. Este determina qué contenido debe recuperarse de la base de datos y mostrarse en la página. En un blog suele tratarse del ID de un artículo concreto. En un foro podría utilizarse para recuperar una entrada específica y, en una tienda en línea, un producto determinado.
Si una URL contiene más de un parámetro, estos se separan con un ampersand (&).
www.example-blog.com/index.php?page=article&id=1
Para ilustrar el uso de $_GET con un ejemplo en este tutorial de PHP, podemos prescindir de la base de datos. En el siguiente script utilizamos la superglobal $_GET para leer los valores de las variables firstname (nombre) y lastname (apellido) de una cadena de consulta HTTP y asignarlos a las variables $firstname y $lastname:
<?php
$firstname = $_GET['firstname'];
$lastname = $_GET['lastname'];
echo "Hello " . $firstname . " " . $lastname . "!";phpEl script se ejecuta mediante la siguiente URL:
localhost/hello.php?firstname=John&lastname=Doe
De este modo pasamos los parámetros firstname=John y lastname=Doe. La salida de los valores se realiza, como en los ejemplos anteriores, mediante la construcción de lenguaje echo.

La transmisión de datos mediante $_GET implica necesariamente que los datos enviados sean visibles en la barra de direcciones. De este modo, siempre es posible ver qué parámetros se están transmitiendo. Esto tiene la ventaja de que las variables pueden integrarse directamente en hipervínculos. Además, las personas que navegan por Internet pueden guardar URL completas, incluida la cadena de consulta, como marcador en el navegador.
Sin embargo, el hecho de que los parámetros GET se muestren en texto plano en la URL hace que este método no sea adecuado para transmitir datos sensibles, como los que se introducen en formularios en línea. Además, la cantidad de datos que se puede transmitir mediante $_GET está limitada por la longitud máxima de las URL.
Puedes evitar estas limitaciones con el método HTTP POST. Los datos enviados de este modo se encuentran en la superglobal $_POST.
Transferencia de datos mediante $_POST
Los métodos HTTP GET y POST se diferencian principalmente en la forma de transferir datos: mientras que en el método GET los datos se envían como parámetros en la URL, con $_POST la transferencia de datos se realiza en el cuerpo de la solicitud HTTP. Esto permite enviar también grandes volúmenes de datos de un script a otro.
Un caso de uso habitual del método HTTP POST es la transferencia de datos desde formularios HTML. Para ilustrarlo, utilizaremos el ejemplo de un registro en una newsletter. Crea para ello un nuevo archivo PHP llamado “page1.php” y copia el siguiente bloque de código:
<form method="post" action="page2.php">
Please send the newsletter to: <br />
Your first name: <input type="text" name="firstname" /><br />
Your last name: <input type="text" name="lastname" /><br />
Your email address: <input type="text" name="email" /><br />
<input type="submit" value="Submit form" />
</form>htmlPara crear formularios se utiliza el elemento HTML <form>. Este contiene en la etiqueta de apertura dos atributos: method y action. Con el atributo method defines el método de transmisión, en este caso HTTP POST. En el atributo action se indica la URL de un script que recibirá todos los datos introducidos en los campos del formulario. El ejemplo muestra un formulario HTML con tres campos de entrada (input type="text") y un botón de envío (input type="submit"). Como destinatario de los datos se define el archivo “page2.php”.
Para ilustrar la transferencia de datos mediante $_POST, utilizaremos un script sencillo que guarda los valores enviados como variables de PHP y los muestra como texto. Crea para ello el archivo “page2.php”. y añade el siguiente código:
<?php
$firstname = $_POST["firstname"];
$lastname = $_POST["lastname"];
$email = $_POST["email"];
echo "Hello " . $firstname . " " . $lastname . ", <br />
You have registered with the following email address: " . $email . ".";phpGuarda ambos archivos PHP en la carpeta “htdocs” de tu servidor de pruebas y abre “page1.php” en el navegador mediante la siguiente URL: http://localhost/page1.php. Tu navegador mostrará ahora la interfaz interactiva del formulario HTML.

Introduce cualquier dato y pulsa el botón de envío para transferir las variables de un script a otro. En cuanto confirmes el formulario en “page1.php”, se te redirigirá automáticamente a “page2.php”. La ventana del navegador mostrará el resultado de la ejecución del script según los datos enviados.

Las entradas de usuario introducidas en los campos del formulario de “page1.php” se recuperan en “page2.php” siguiendo el siguiente esquema:
$_POST["Name of the input field"] (nombre del campo de entrada)
Así, la línea $firstname = $_POST["firstname"] recupera el valor introducido en el campo de texto firstname y lo guarda en la variable $firstname. A su vez, la variable $firstname se puede mostrar como cadena mediante echo.
La estructura if y los operadores de comparación en PHP
Hasta ahora hemos definido variables, las hemos transferido de un script a otro y las hemos mostrado como texto. En el siguiente paso aprenderás a vincular la ejecución de fragmentos de código a determinadas condiciones.
La construcción de lenguaje if te permite escribir scripts de modo que ciertas instrucciones solo se ejecuten cuando se cumple una condición definida previamente; por ejemplo, cuando se introduce una contraseña correcta. En PHP, las condiciones se definen siguiendo la siguiente estructura básica:
<?php
if (expression)
{
statement;
}phpEsto significa que la instrucción statement solo se ejecuta cuando se cumple la condición definida en expression. Una condición se considera cumplida cuando la construcción if devuelve el resultado TRUE (verdadero). En caso contrario, se considera FALSE (falso) y la instrucción se omite.
Por lo general, la construcción if comprueba si el valor de una variable coincide con lo que se ha definido en la condición. Esta estructura de control suele implementarse mediante operadores de comparación.
Operadores de comparación
Los operadores de comparación se utilizan al formular condiciones para poner dos valores en una relación lógica que puede evaluarse como verdadera (TRUE) o falsa (FALSE). Cuando se utilizan en estructuras de control de PHP, estos operadores comparan dos valores dentro de la expression de una construcción if:
if ($a == $b)
{
statement;
}phpEn lenguaje natural, esta estructura se interpreta así: si la variable $a es igual a la variable $b, entonces se ejecutan las instrucciones definidas en statement.
Los operadores de comparación de PHP se basan en el lenguaje de programación C y, en parte, se diferencian de los símbolos clásicos utilizados en matemáticas. La siguiente tabla ofrece una visión general:
| Operador de comparación | Descripción | Condición |
|---|---|---|
== |
es igual | La condición se cumple cuando $a y $b tienen el mismo valor. |
=== |
es idéntico | La condición se cumple cuando $a y $b tienen el mismo valor y pertenecen al mismo tipo de dato. Por ejemplo, 1 == "1" será TRUE y 1 === "1" será FALSE. En muchos casos se recomienda usar ===. |
!= |
es distinto | La condición se cumple cuando $a y $b tienen valores distintos. |
!== |
no es idéntico | La condición se cumple cuando $a y $b tienen valores distintos o pertenecen a tipos de datos diferentes. |
< |
es menor que | La condición se cumple cuando el valor de $a es menor que el valor de $b. |
> |
es mayor que | La condición se cumple cuando el valor de $a es mayor que el valor de $b. |
<= |
es menor o igual que | La condición se cumple cuando el valor de $a es menor que el valor de $b o ambos valores son iguales. |
>= |
es mayor o igual que | La condición se cumple cuando el valor de $a es mayor que el valor de $b o ambos valores son iguales. |
El siguiente script pretende aclarar esta estructura de control. En él se comparan dos números enteros utilizando el operador < (menor que):
<?php
$number1 = 10;
$number2 = 20;
if ($number1 < $number2) {
echo "The condition is met";
}phpDefinimos las variables $number1 y $number2 y les asignamos los valores 10 y 20. A continuación, establecemos una condición: si $number1 es menor que $number2, se mostrará el texto indicado en la instrucción echo.
El resultado de la ejecución del script contiene la respuesta: 10 es menor que 20. La construcción if devuelve el resultado TRUE y se ejecuta el código correspondiente.

Si quieres definir instrucciones que se ejecuten cuando no se cumple una condición, puedes ampliar la estructura con la construcción else, formando así una instrucción if-else en PHP:
<?php
if(Condition a)
{
statement b;
}
else
{
statement c;
}phpEste script también comprueba si la condición a devuelve el resultado TRUE o FALSE. Si se cumple la condición a, se ejecuta la instrucción b. Si la condición a no se cumple (FALSE), se omite la instrucción b y en su lugar se ejecuta la instrucción c.
Ampliemos el ejemplo anterior con la construcción else y sustituyamos el operador < (es menor) por == (es igual):
<?php
$number1 = 10;
$number2 = 20;
if($number1 == $number2)
{
echo "The condition is met";
}
else
{
echo "The condition is not met";
}phpEn este caso la condición devuelve el resultado FALSE, ya que el valor de $number1 no es igual al valor de $number2. La condición no se cumple. Por lo tanto, no se ejecuta la instrucción indicada en if, sino la definida en else.

Si quieres comprobar si dos valores son iguales, debes usar el operador de comparación doble (==). El signo de igualdad simple (=) se utiliza únicamente para asignar valores a variables.
La negación de una condición se realiza mediante un signo de exclamación (!) colocado delante:
<?php
$number1 = 10;
$number2 = 20;
if ($number1 == $number2)
{
echo "The numbers are equal.";
}
if (!($number1 == $number2))
{
echo "The numbers are not equal.";
}phpEl ejemplo muestra la condición $number1 == $number2 y su negación. !($number1 == $number2) equivale a ($number1 != $number2). Una aplicación práctica de if y else es, por ejemplo, la verificación de una contraseña mediante un formulario HTML. Vamos a simularla de nuevo con la ayuda de nuestros archivos PHP “page1.php” y “page2.php”.
Abre “page1.php” e inserta el siguiente formulario:
<form action="page2.php" method="post">
Please enter your password: <input type="password" name="password" />
<input type="submit" value="Submit" />
</form>htmlLa estructura es similar a la del formulario anterior, pero ahora solo necesitamos un campo de entrada para la contraseña. Como antes, los datos introducidos se envían al script “page2.php”.
A continuación, ajustamos “page2.php” con el siguiente código para que la contraseña introducida se compare con una contraseña almacenada:
<?php
$password = $_POST["password"];
if($password=="qwerty123")
{
echo "The password was correct";
}
else
{
echo "The password was incorrect";
}phpEl código funciona de la siguiente manera: primero asignamos a la variable $password el valor recibido mediante el método HTTP POST. A continuación, la estructura if comprueba si el valor de la variable $password coincide con la cadena qwerty123. Si es así, se muestra la cadena “The password was correct“ (la contraseña es correcta). Si if devuelve el resultado FALSE, entra en juego else en la línea 7 y se muestra la cadena “The password was incorrect” (la contraseña es incorrecta).
Ahora abre el script “page1.php” en el navegador mediante la URL http://localhost/page1.php.

El navegador nos muestra la vista web de nuestro formulario HTML para la solicitud de contraseña. Introduce la contraseña “qwerty123” definida en el script “page2.php” y haz clic en el botón de envío.

El navegador te redirigirá automáticamente a “page2.php”. En segundo plano, la estructura de control if compara el valor introducido con la contraseña almacenada y evalúa la expresión qwerty123 == qwerty123, y muestra la cadena “The password was correct“ (la contraseña es correcta). Comprueba qué ocurre cuando escribes una contraseña diferente en el campo de entrada.
Operadores lógicos
Las condiciones que defines con operadores de comparación en la expresión del constructo if pueden, si es necesario, combinarse con otras condiciones dentro de la misma expresión. Para ello, PHP ofrece operadores lógicos como AND y OR.
| Asociación fuerte | Asociación débil | Descripción |
|---|---|---|
&& |
AND |
Ambas condiciones unidas por el operador deben ser TRUE. |
|| |
OR |
Solo una de las dos condiciones unidas por el operador tiene que ser TRUE. |
En PHP existen operadores lógicos con asociación fuerte y con asociación débil. Si utilizas solo una de las dos notaciones, en la práctica no notarás ninguna diferencia. Sin embargo, si combinas ambas, verás que && y || tienen una precedencia mayor que AND y OR. Esto es comparable al orden de precedencia de los operadores matemáticos. Por ejemplo, la multiplicación va antes que la suma: * tiene una asociación más fuerte que +.
Un ejemplo práctico es el inicio de sesión con nombre de usuario y contraseña. Normalmente, un sistema de acceso requiere ambos datos. Solo cuando los dos coinciden con los valores almacenados, el acceso se concede.
Volvemos a abrir nuestro formulario de solicitud de contraseña en “page1.php” y añadimos un campo de entrada para el nombre de usuario:
<form action="page2.php" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Submit" />
</form>htmlEn el siguiente paso también tenemos que ajustar la estructura de control del constructo if. Para ello utilizamos el operador lógico AND y combinamos la condición de la contraseña con la condición del nombre de usuario:
<?php
$username = $_POST["username"];
$password = $_POST["password"];
if($username=="John Doe" AND $password=="qwerty123")
{
echo "Welcome to the members area " . $username . "!";
}
else
{
echo "Access denied";
}phpNuestro script “page2.php” recibe ahora los valores de username y password y los guarda en las variables $username y $password. La expresión del constructo if contiene ahora dos condiciones unidas por el operador lógico AND. Solo si ambas condiciones se cumplen ($username == "John Doe" y $password == "qwerty123") la construcción if devuelve el resultado TRUE.
Como el nombre de usuario se obtiene a través del campo username, podemos utilizarlo directamente en la salida de texto con echo: a “Welcome to the members area” (Bienvenido al área interna) le sigue el valor de la variable $username. Si no se cumple una de las dos condiciones, obtenemos la salida de texto: “Access denied” (Acceso denegado).

Los operadores lógicos se pueden combinar libremente. Ten en cuenta que && tiene una precedencia mayor que AND, y || mayor que OR. Al igual que en las expresiones matemáticas, en PHP también puedes utilizar paréntesis para modificar el orden de evaluación.
Condiciones con match
Hasta ahora hemos implementado decisiones en PHP con instrucciones if y else. Sin embargo, cuando se evalúa un único valor y deben producirse resultados diferentes según ese valor, el código con if puede volverse rápidamente confuso. Para este tipo de situaciones existe la instrucción match.
<?php
$status = 404;
echo match ($status) {
200 => "OK",
404 => "Not found",
default => "Unknown status",
};phpEn este ejemplo se evalúa el valor de la variable $status. Si es igual a 200, match devuelve el texto “OK”. Si el valor es 404, se devuelve “Not found” (no encontrado). Si ninguno de los valores indicados coincide, se ejecuta el caso default y se devuelve “Unknown status” (desconocido).

La diferencia más importante con if-else es que match devuelve directamente un valor que puede utilizarse en una expresión o asignarse a una variable. De este modo se evita escribir varias asignaciones dentro de condiciones individuales y el código resulta más corto, claro y fácil de mantener.
Bucles (while, for)
A veces es necesario que un script ejecute un determinado bloque de código varias veces antes de continuar con el resto del programa. Los lenguajes de programación utilizan para ello el concepto de bucles en PHP. Se distinguen tres tipos de bucles:
- Bucles
while - Bucles
do-while - Bucles
for
Bucles while
El bucle while es el tipo de bucle más sencillo disponible en PHP. Su estructura básica sigue el siguiente esquema:
while (condition)
{
loop step and other statements
}phpEl bucle while indica a PHP que ejecute las instrucciones incluidas en el bloque mientras se cumpla la condición definida. Para ello, el intérprete de PHP comprueba la condición al inicio de cada iteración. La ejecución del bloque solo se detiene cuando la condición deja de cumplirse. Este principio se puede ilustrar con un sencillo script de conteo:
<?php
$number = 1;
while ($number <= 10) {
echo $number++ . "<br />";
}phpEn el apartado “Calcular con variables” se introdujo el principio del incremento. En este ejemplo lo utilizamos de nuevo, pero con el operador de postincremento para aumentar en 1 el valor de la variable entera $number después de mostrar su valor mediante echo. La condición del bucle while es $number <= 10. Por tanto, la instrucción echo se repite hasta que $number supera el valor 10.

El resultado de la ejecución del script es una secuencia de números que muestra en cada iteración el valor actual de $number. De este modo, el script cuenta de 1 a 10 y finaliza la ejecución del código en cuanto deja de cumplirse la condición del bucle while.
Bucles do-while
La estructura del bucle do-while es similar a la del bucle while. La única diferencia es que la condición no se comprueba al comienzo de cada iteración, sino al final. El esquema básico de un bucle do-while es el siguiente:
do {
loop step and other statements
}
while (condition);phpSi reescribimos el ejemplo anterior como un bucle do-while, tendría el siguiente aspecto:
<?php
$number = 1;
do {
echo $number++ . "<br />";
}
while ($number <= 10);phpEn este caso el resultado es el mismo. La característica particular del bucle do-while es que siempre se ejecuta al menos una vez, incluso si la condición no se cumple desde el principio.
Bucles for
Básicamente, el bucle for en PHP tiene la misma funcionalidad que el bucle while. La diferencia es que el valor inicial, la condición y el paso del bucle se escriben en una sola línea. La estructura básica del bucle for es la siguiente:
for (initial value; condition; loop step)
statementsphpEl ejemplo que ya conocemos se podría escribir como un bucle for de forma más compacta:
<?php
for($number = 1; $number <= 10; $number++) {
echo $number . "<br /> ";
}phpPrimero se define el valor inicial “1” para la variable $number. Después, PHP comprueba si se cumple la condición $number <= 10. Si es así, el bucle continúa y se ejecutan las instrucciones del bloque (en este caso, la instrucción echo). Después se ejecuta el paso del bucle, es decir, el incremento de la variable. Cuando finaliza el paso del bucle, comienza la siguiente iteración.
El valor inicial, la condición y el paso del bucle son elementos opcionales de un bucle for. En teoría, incluso podrían definirse bucles vacíos. Sin embargo, en la práctica este tipo de estructuras suele ser innecesario.
En general, puedes decidir libremente si utilizas un bucle for o un bucle while. No obstante, existe un argumento a favor de los bucles for: permiten ver de un vistazo todos los elementos que controlan el bucle. Esto reduce el riesgo de crear accidentalmente un bucle infinito que se ejecute indefinidamente. En el ejemplo anterior, esto podría ocurrir si olvidaras incrementar el valor de la variable $number.
Si necesitas que el bucle se ejecute al menos una vez independientemente de la condición, entonces el bucle do-while es la opción adecuada.
break y continue
El flujo de un bucle while, do-while o for se puede controlar con las instrucciones break y continue. Utiliza break para interrumpir la ejecución de un bucle en cualquier punto, y continue para saltar una iteración concreta del bucle. Ambas instrucciones suelen combinarse con una condición mediante if. El siguiente ejemplo muestra nuestro script de conteo utilizando break:
<?php
for ($number = 1; $number <= 10; $number++) {
if ($number == 5) {
echo "At 5, we break out of the loop!";
break;
}
echo $number . "<br /> ";
}phpEn el bucle for hemos definido que el valor de la variable $number, partiendo del valor inicial 1, se incremente en 1 en cada iteración del bucle hasta alcanzar el valor 10. Ahora interrumpimos el bucle de forma anticipada con la instrucción break en cuanto $number alcanza el valor 5. De este modo, la construcción echo solo muestra los números del 1 al 4.

Si solo queremos omitir la quinta iteración, pero no detener toda la ejecución del bucle, sustituimos la instrucción break por continue:
<?php
for ($number=1; $number <= 10; $number++) {
if ($number == 5) {
echo "Number 5 is skipped!<br />";
continue;
}
echo $number . "<br /> ";
}phpEn este caso el bucle continúa ejecutándose normalmente. Cuando $number es 5, el script muestra el mensaje definido en if (“Number 5 is skipped!” (¡Nos saltamos el 5!)) y pasa directamente a la siguiente iteración, sin ejecutar la instrucción echo que mostraría el número.

Operaciones con archivos
Los contenidos web dinámicos se basan en una separación entre contenido y presentación. Por eso, los lenguajes de scripting como PHP ofrecen diferentes funciones que permiten cargar contenidos desde fuentes de datos externas en archivos de plantilla centrales (template files).
En la práctica, estas fuentes de datos suelen ser bases de datos gestionadas con sistemas como MySQL. Sin embargo, también es posible incluir datos directamente desde archivos. A continuación veremos cómo leer archivos como cadena (string) en un script de PHP y cómo procesar su contenido.
Leer archivos
Para leer el contenido de un archivo, PHP ofrece varias funciones. Para nuestros propósitos destacan file() y file_get_contents(). Mientras que la función file_get_contents() lee todo el contenido de un archivo en una cadena (string), la función file() almacena el contenido como un array. Cada elemento del array corresponde a una línea del archivo. Con file() resulta más fácil trabajar con líneas individuales.
Para demostrar las operaciones con archivos en PHP utilizaremos el archivo de texto example.txt, que guardamos en la carpeta htdocs de nuestro servidor de pruebas. El archivo contiene cuatro líneas de texto de ejemplo:

Primero leemos el archivo completo como una cadena (string). Para ello, pasamos el nombre del archivo como parámetro a la función file_get_contents():
file_get_contents('example.txt')
Ahora podemos trabajar con la cadena leída. Por ejemplo, podemos asignarla a una variable y mostrarla como texto en el navegador web:
<?php
$example = file_get_contents('example.txt');
echo $example;phpEn el navegador veremos que la cadena se muestra sin párrafos. Los saltos de línea del archivo original no se reflejan visualmente. Esto ocurre porque el navegador interpreta la salida del script como código HTML, y los saltos de línea del archivo de texto no se convierten automáticamente en saltos de línea HTML.

Si quieres mantener la estructura original, tienes varias opciones. Puedes añadir manualmente en el archivo de origen la codificación HTML para el salto de línea (<br>) usando buscar y reemplazar, envolver el contenido del archivo con una etiqueta <pre>, asignar a la zona la propiedad de CSS white-space: pre-wrap o utilizar la función nl2br() para indicarle a PHP que convierta automáticamente los saltos de línea en saltos de línea HTML. La función se usa siguiendo este esquema:
<?php
$example = file_get_contents('example.txt');
echo nl2br($example);phpCuando se utiliza echo en combinación con nl2br(), PHP inserta un salto de línea HTML antes de cada nueva línea de texto.

Si quieres mostrar las líneas de un archivo de forma individual, la función file() es una buena opción. Esta función lee un archivo, numera todas las líneas empezando por 0 y guarda su contenido como elementos de un array. Aplicado a nuestro ejemplo, se obtiene la siguiente asignación:
[0] = Lorem ipsum dolor sit amet, consectetuer adipiscing elit
[1] = Aenean commodo ligula eget dolor. Aenean massa.
[2] = Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
[3] = Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
Para mostrar una línea concreta con echo, solo tienes que indicar el índice correspondiente. Así, por ejemplo, el siguiente script muestra únicamente la primera línea del archivo “example.txt” como salida para el navegador:
<?php
$example = file("example.txt");
echo $example[0];php
Escribir archivos
Con PHP no solo puedes leer archivos. El lenguaje de scripting también te permite crear archivos y escribir contenido en ellos.
Para ello utilizamos la función de PHP file_put_contents(). Esta función espera dos parámetros: el nombre del archivo que se va a crear o actualizar y los datos en forma de string o array. El siguiente script crea el archivo test.txt y escribe la cadena “This is a test!” (¡Esto es una prueba!) en la primera línea. El añadido \r\n provoca un salto de línea en el archivo de destino.
<?php
file_put_contents("test.txt", "This is a test! \r\n");
echo "test.txt has been created!";phpComo file_put_contents no genera ninguna salida para el navegador, añadimos una instrucción echo para indicar qué acción se está realizando.

Si en la carpeta de destino ya existe un archivo con el mismo nombre, este se sobrescribe. Puedes evitarlo añadiendo el parámetro FILE_APPEND:
<?php
file_put_contents("test.txt","The test was successful! \r\n", FILE_APPEND);
echo "test.txt has been updated!";phpSi utilizas file_put_contents() con el parámetro FILE_APPEND, el nuevo contenido se añade al contenido ya existente.

El contenido que PHP escribe en el archivo de destino no tiene por qué definirse necesariamente en el propio script. Como alternativa, también puedes copiar el contenido de un archivo a otro. El siguiente script lee el contenido de example.txt y lo inserta en el archivo test.txt:
<?php
$example = file_get_contents("example.txt");
file_put_contents("test.txt", $example, FILE_APPEND);
echo "test.txt has been updated!";php- Plantillas profesionales, dominio y correo electrónico
- Herramientas SEO y más de 17 000 imágenes libres de derechos
- Plugin para hacer reservas online
Programación orientada a objetos
La programación orientada a objetos (OOP) es un método para dividir los programas en unidades pequeñas y manejables, los llamados objetos. Cada objeto pertenece a una clase, que describe qué propiedades y métodos tiene. Las propiedades son variables que almacenan características del objeto, mientras que los métodos son funciones que el objeto puede ejecutar. La OOP ayuda a estructurar mejor el código, hacerlo reutilizable y facilitar su mantenimiento, especialmente en proyectos grandes.
Clases
Una clase es una plantilla para crear objetos. Puedes imaginar una clase como el plano de un coche, mientras que un objeto sería un coche concreto creado a partir de ese plano. La clase define qué datos contiene un objeto y qué funciones puede ejecutar. En el siguiente ejemplo vemos una clase Car (coche):
class Car {
public string $brand;
public string $model;
public function move () {
echo "The car is moving!";
}
}
$myCar = new Car();
$myCar->brand = "VW";
$myCar->model = "Golf";
$myCar->move();phpEn este ejemplo se define la clase Car, que tiene dos propiedades, $brand (marca) y $model (modelo), así como un método move() (moverse). A continuación, se crea un objeto de esta clase asignando la clase “Car” a $myCar (mi coche). Con el operador -> accedemos a las propiedades del objeto y asignamos a $brand el valor VW y a $model el valor Golf. Después llamamos al método move(), que muestra el texto “The car is moving!” (¡El coche se está moviendo!). La palabra clave $this haría referencia, dentro del método, al objeto actual.

Promoción de propiedades en el constructor
Desde PHP 8.0 puedes definir e inicializar propiedades directamente en el constructor, es decir, en el método que se ejecuta automáticamente al crear un objeto de una clase. De este modo ya no es necesario declararlas previamente en la clase, lo que hace que el código sea más compacto y fácil de leer.
class Product {
public function __construct(
public string $name,
public float $price
) {}
}
$product = new Product("Cup", 12.99);
echo $product->name;
echo $product->price;phpEn este ejemplo las propiedades name y price se declaran directamente en el constructor. Al crear el objeto Product se pasan los valores “Cup” (taza) y “12.99”. Con $product->name y $product->price accedemos a los valores que se han establecido automáticamente al crear el objeto. La promoción de propiedades en el constructor reduce la cantidad de código necesario y hace que las clases sean más claras y fáciles de mantener.
Interfaces
Una interfaz define qué métodos debe tener una clase, sin especificar su implementación concreta. Las clases que implementan una interfaz deben definir estos métodos. De este modo, diferentes clases pueden utilizarse de forma uniforme.
<?php
interface Movable {
public function move();
}
class Car implements Movable {
public function move() {
echo "The car is moving!";
}
}
$myCar = new Car();
$myCar->move();phpEn este ejemplo, la interfaz Movable (movible) define que cada clase que la implemente debe tener un método move(). La clase Car implementa esta interfaz y define el método correspondiente. A continuación se crea un objeto de la clase y se llama al método, lo que provoca que se muestre el texto “The car is moving!” (¡El coche se está moviendo!).

Tipos de intersección
Los tipos de intersección existen desde PHP 8.1. Permiten que un objeto tenga que cumplir varias interfaces al mismo tiempo. Esto resulta especialmente útil cuando una función necesita garantizar que un objeto dispone de determinadas capacidades.
interface Loggable {}
function save(JsonSerializable&Loggable $object) {
echo "The object can save JSON data and log information.";
}phpEn este ejemplo, los objetos que se pasan a la función save() tienen que implementar tanto la interfaz JsonSerializable como Loggable. La combinación de ambas se expresa mediante el operador &. De este modo se garantiza que la función solo puede trabajar con objetos que cumplen ambos contratos al mismo tiempo.
Propiedades de solo lectura
Las propiedades readonly (de solo lectura) existen desde PHP 8.1. Solo pueden establecerse una vez al crear un objeto y no pueden modificarse posteriormente. Esto resulta especialmente útil para proteger datos frente a cambios no intencionados.
class User {
public function __construct(
public readonly string $name
) {}
}
$user = new User("Max");
echo $user->name;phpEn este ejemplo la propiedad name se define directamente en el constructor y se marca como readonly. Esto significa que el valor “Max” no puede modificarse después de crear el objeto. Si intentas cambiar el valor más adelante, se producirá un error. Las propiedades de solo lectura son ideales para datos que deben permanecer inmutables, como los identificadores de usuario o los valores de configuración.
Property Hooks
Los Property Hooks permiten, desde la versión 8.4 de PHP, ejecutar lógica directamente al asignar o leer una propiedad. Esto resulta muy práctico cuando los valores deben procesarse automáticamente.
class User {
public string $email {
set => strtolower($value);
get => strtoupper($this->email);
}
}
$user = new User();
$user->email = "Test@Example.com";
echo $user->email;phpEn este ejemplo, al asignar un valor a la propiedad email, todo se convierte automáticamente a minúsculas, mientras que al leerla se muestra todo en mayúsculas. Así puedes procesar los datos de forma coherente sin tener que escribir métodos adicionales.
Visibilidad asimétrica
Con la visibilidad asimétrica, introducida también en la versión 8.4 de PHP, puedes definir que una propiedad se pueda leer de forma pública, pero solo se pueda modificar dentro de la clase. Esto protege datos importantes frente a cambios no controlados.
class Account {
public private(set) float $balance = 0.0;
public function deposit(float $amount) {
$this->balance += $amount;
}
}
$account = new Account();
$account->deposit(50);
echo $account->balance;phpEn este ejemplo, el saldo de la cuenta puede leerse públicamente, pero solo puede modificarse dentro de la propia clase. El método deposit() permite incrementar el saldo de forma controlada. Si intentas escribir directamente en $balance, se producirá un error. Así se pueden proteger datos importantes manteniendo el acceso para las operaciones permitidas.
Escribir código PHP limpio
A medida que un proyecto crece, también aumenta la importancia de mantener código bien estructurado y limpio. Un código PHP limpio es más fácil de leer, más sencillo de mantener y menos propenso a errores. Por eso, las aplicaciones PHP siguen ciertas convenciones y utilizan herramientas que fomentan el orden, la claridad y la seguridad.
Composer y PSR-4 (carga automática de clases)
Composer es una herramienta central en el desarrollo con PHP. Sirve para gestionar bibliotecas externas y cargar automáticamente clases de PHP. Sin Composer tendrías que incluir las clases manualmente con require o include, lo que en proyectos grandes se vuelve rápidamente difícil de mantener. Composer utiliza normalmente el estándar de autocarga PSR-4. Este estándar define cómo se encuentran las clases según su nombre y su ubicación en el sistema de archivos. El nombre de una clase se corresponde con la estructura de carpetas donde está guardada.
Un ejemplo sencillo ilustra este principio. Si una clase User se encuentra en el espacio de nombres App\Model, el archivo correspondiente se ubica en una carpeta “src/Model”:
<?php
namespace App\Model;
class User {
public function getName() {
return "Max Mustermann";
}
}phpGracias a PSR-4, esta clase puede utilizarse en cualquier parte del proyecto sin tener que incluir el archivo manualmente. PHP la carga automáticamente cuando se necesita. Esto hace que el código sea más claro y reduce posibles fuentes de errores.
Namespaces para una separación clara del código
Los namespaces te ayudan a agrupar clases de forma lógica y a evitar conflictos de nombres. En scripts pequeños puedes llamar a una clase simplemente User o Database sin problema. Pero en aplicaciones más grandes puede ocurrir que varias clases tengan el mismo nombre y cumplan funciones distintas. Con los namespaces puedes separar claramente estas clases. Así, por ejemplo, puede existir una clase User para la base de datos y otra clase User para la presentación en el frontend, sin que se produzcan conflictos.
El siguiente ejemplo muestra el uso de un namespace:
<?php
namespace App\Service;
class Mailer {
public function send() {
echo "Email has been sent.";
}
}phpAl utilizar la clase, se emplea el nombre completo incluido el namespace o se importa mediante use. De este modo, el código se mantiene inequívoco y bien estructurado.
Estructura del proyecto: archivos .env y .gitignore
Una estructura de proyecto clara es una parte importante de un código PHP limpio. En los proyectos PHP se separa el propio código del programa de los archivos accesibles públicamente y de los datos de configuración. A menudo, el código PHP se encuentra en una carpeta propia, mientras que el servidor web solo puede acceder a un directorio público.
Los valores de configuración como los datos de acceso a la base de datos o las claves de API normalmente no se guardan directamente en el código. En su lugar se utilizan los llamados archivos .env, donde estos valores se almacenan de forma centralizada. Esto aumenta la seguridad y facilita el cambio entre el entorno de desarrollo y el de producción.
Un ejemplo sencillo de un archivo .env podría tener este aspecto:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=secrettextEste archivo no se guarda deliberadamente en el control de versiones. De ello se encarga el archivo .gitignore, que determina qué archivos o carpetas deben ser ignorados por Git. En .gitignore se excluye explícitamente el archivo .env para evitar que los datos sensibles se publiquen por accidente.
Gestión de errores y registro (logging)
El manejo de errores difiere entre el entorno de desarrollo y el de producción. Durante el desarrollo, es útil mostrar directamente los mensajes de error de PHP. Así puedes detectar y solucionar los problemas rápidamente.
En aplicaciones en producción, en cambio, los mensajes de error no deberían mostrarse, ya que podrían revelar información interna. En su lugar, los errores se escriben en archivos de registro (logs) a los que solo tienen acceso los desarrolladores.
En un entorno de desarrollo, la salida de errores puede activarse, por ejemplo, de la siguiente manera:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);phpEn un entorno de producción, la visualización de errores se desactiva y se activa el registro (logging). PHP escribe los errores que se produzcan en un archivo de log, sin mostrarlos a quienes visitan la página web. De este modo, la aplicación sigue siendo estable y segura, mientras que los errores quedan documentados y se pueden rastrear.
Conceptos básicos de bases de datos con PHP: un ejemplo sencillo con PDO
Para almacenar o leer datos con PHP, necesitas una base de datos. En este ejemplo utilizamos MySQL, que viene incluido por defecto en XAMPP. PHP puede comunicarse de forma segura con la base de datos mediante PDO (PHP Data Objects). PDO se asegura de que los comandos se ejecuten correctamente y ofrece prepared statements: los marcadores de posición separan el comando SQL de las entradas de los usuarios, de modo que estas no se ejecuten como parte del comando.
Crear la base de datos y la tabla
Primero creamos en phpMyAdmin una nueva base de datos con el nombre testdb. Dentro de esta base de datos, creamos una tabla llamada users. Esta tabla contiene tres columnas: id para la identificación única de cada usuario, username para el nombre de usuario y email para la dirección de correo electrónico. En SQL tendría el siguiente aspecto:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);sqlOperaciones con bases de datos en PHP
Ahora creamos un archivo “crud.php” en la carpeta “htdocs” de XAMPP. En este ejemplo establecemos una conexión con la base de datos y mostramos primero las operaciones básicas CREATE, READ, UPDATE y DELETE (CRUD):
<?php
// Establish database connection
$host = '127.0.0.1';
$db = 'testdb';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Make errors visible
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Data as array
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
exit;
}
// CREATE: insert new user
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->execute([
'username' => 'Max Mustermann',
'email' => 'max@example.com'
]);
// READ: fetch all users
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();
// Output the user list
echo "<h2>User list</h2>";
foreach ($users as $user) {
echo "ID: " . $user['id'] . " – Name: " . htmlspecialchars($user['username']) . " – E-Mail: " . htmlspecialchars($user['email']) . "<br>";
}
// UPDATE: change a user's email
$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE username = :username");
$stmt->execute([
'email' => 'max.mustermann@example.com',
'username' => 'Max Mustermann'
]);
echo "<p>The email address of Max Mustermann has been updated.</p>";
// DELETE: delete user
$stmt = $pdo->prepare("DELETE FROM users WHERE username = :username");
$stmt->execute([
'username' => 'Max Mustermann'
]);
?>phpPrimero se establece una conexión con la base de datos mediante PDO. Para ello indicamos el host, el nombre de la base de datos, el nombre de usuario, la contraseña y el juego de caracteres. PDO se encarga de ejecutar los comandos SQL y de gestionar los errores.
A continuación mostramos las cuatro operaciones básicas:
CREATE(inserción de datos): conINSERT INTOinsertamos un nuevo usuario. Los marcadores de posición:usernamey:emailgarantizan que las entradas de los usuarios se procesen de forma segura.READ(lectura de datos): conSELECT * FROM usersobtenemos todos los registros existentes. ConfetchAll()guardamos los resultados en un array y los mostramos en una lista clara y ordenada.UPDATE(modificación de datos): conUPDATEpodemos cambiar la dirección de correo electrónico de un usuario. Volvemos a utilizar marcadores de posición para insertar los valores de forma segura.DELETE(eliminación de datos): conDELETE FROM users WHERE username = :usernameeliminamos de la base de datos a un usuario concreto. El marcador de posición:usernamegarantiza que la entrada se procese de forma segura, sin que un posible atacante pueda manipular la base de datos. Así podemos borrar registros individuales sin afectar a toda la tabla.
Entradas de usuario seguras y procesamiento de datos
En cuanto PHP trabaja con entradas de usuarios, surge un riesgo de seguridad. Las personas que visitan tu página pueden manipular los campos de los formularios, enviar datos inesperados o intentar deliberadamente abusar de una aplicación. Por eso, PHP ofrece varias funciones con las que se pueden comprobar, procesar y almacenar de forma segura las entradas.
Almacenar datos de forma segura en bases de datos: prepared statements
Una de las vulnerabilidades de seguridad más frecuentes en aplicaciones PHP aparece al trabajar con bases de datos. Si las entradas de los usuarios se insertan directamente en consultas de SQL, puede producirse una inyección SQL. En este caso, los atacantes introducen su propio código SQL en la consulta.
Las prepared statements (consultas preparadas) evitan este problema separando de forma estricta el código SQL de los datos de los usuarios. Para ello, PHP ofrece la interfaz de acceso a bases de datos PDO.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute([
'username' => $username
]);phpEl código prepara una consulta a la base de datos para buscar a todos los usuarios de la tabla users cuyo nombre de usuario coincide con un valor determinado. En lugar de escribir el nombre de usuario directamente en la instrucción SQL, se utiliza el marcador de posición :username, que solo se rellena con un valor concreto al ejecutar la consulta. De este modo, PHP separa el código SQL de los datos de los usuarios y evita que las entradas puedan manipular la instrucción.
Proteger las salidas: escape de salida (output escaping)
No solo el almacenamiento de datos, sino también su salida puede suponer un riesgo de seguridad. Si muestras las entradas de los usuarios en el navegador sin filtrarlas, puede producirse el llamado Cross-Site Scripting (XSS). En este caso, se ejecuta código malicioso en el navegador de otros usuarios. Para evitarlo, las salidas deben escaparse antes de mostrarse. En PHP esto se hace normalmente con la función htmlspecialchars(). De este modo, el texto se muestra en el navegador, pero no se interpreta como código HTML.
<?php
echo htmlspecialchars("<h1>Hello World!</h1>", ENT_QUOTES, 'UTF-8');php
Filtrar las entradas de los usuarios: filter_input()
PHP ofrece con filter_input() una forma de validar y filtrar las entradas de las personas usuarias en el momento de leerlas. Así se pueden detectar pronto valores no válidos o no deseados. Un ejemplo sencillo es la lectura de una dirección de correo electrónico:
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);phpSi la entrada no es una dirección de correo electrónico válida, la función devuelve false. Si el campo ni siquiera se envía, el resultado es null. Por eso, comprueba ambos casos. De este modo, el código puede reaccionar de forma específica antes de seguir trabajando con los datos.
Almacenar contraseñas de forma segura con password_hash()
Las contraseñas nunca deben almacenarse en texto plano. Ni siquiera un cifrado sencillo es suficiente. Para ello, PHP ofrece la función password_hash(), que genera un hash seguro de las contraseñas.
<?php
$hash = password_hash($password, PASSWORD_DEFAULT);phpDurante el inicio de sesión posterior, la contraseña introducida se comprueba con password_verify():
<?php
if (password_verify($password, $hash)) {
echo "Login successful";
}phpEl valor real de la contraseña nunca vuelve a ser visible. Incluso en caso de una filtración de la base de datos, las contraseñas siguen protegidas.
Protección frente a la manipulación de formularios: tokens CSRF
En los formularios existe el riesgo de que se envíen sin que los usuarios lo sepan. Para evitarlo, se utilizan los llamados tokens CSRF. Se trata de cadenas de caracteres aleatorias que se generan de nuevo cada vez que se carga un formulario.
<?php
$_SESSION['token'] = bin2hex(random_bytes(32));phpEsta línea genera un código de seguridad aleatorio y difícil de adivinar y lo guarda en la sesión actual del usuario. La función random_bytes(32) crea 32 bytes aleatorios, es decir, datos en bruto que no son directamente legibles. Con bin2hex() esos datos en bruto se convierten en una cadena de caracteres legible formada por letras y números. El valor generado se almacena en $_SESSION['token'] y se utiliza después para comprobar si un formulario proviene realmente de la misma sesión.
Carga de archivos con validación
Las cargas de archivos también son especialmente sensibles y pueden introducir riesgos de seguridad, ya que permiten que archivos externos lleguen al servidor. Por eso, siempre se deben comprobar el tipo de archivo y su tamaño.
Un ejemplo sencillo de comprobación del tamaño de un archivo podría tener este aspecto:
<?php
if ($_FILES['upload']['size'] > 1000000) {
echo "File is too big.";
}phpEl código comprueba cuál es el tamaño del archivo subido y lo compara con un valor máximo fijado de 1,000,000 bytes. Si el archivo es más grande de lo permitido, se muestra un mensaje de error y se puede rechazar la carga. De este modo se evita que se suban al servidor archivos demasiado grandes. Además, se debe verificar que realmente se trate del tipo de archivo esperado, por ejemplo, una imagen. Nunca se deben almacenar archivos subidos en ubicaciones ejecutables sin validarlos previamente.

