PHP básico para principiantes

Tu primer paso hacia el desarrollo backend. Explicado paso a paso para estudiantes

Haz una página en HTML puro y verás que tiene un límite claro: es la misma para todo el mundo. No puede saludarte por tu nombre, no puede recordar lo que escribiste en un formulario, no puede sumar dos números que le pases. Para eso hace falta algo que se ejecute en el servidor antes de que la página llegue a tu navegador. Ahí es donde entra PHP.

En España, PHP es el lenguaje de servidor que se enseña en casi todos los ciclos de DAW y DAM, y sigue siendo el que más se pide en ofertas de backend junior. Aquí vas a montar tu propio entorno, escribir tus primeras líneas y acabar con una calculadora que funciona de verdad, con formulario y todo.

Qué es PHP en realidad

PHP significa "PHP: Hypertext Preprocessor", un acrónimo recursivo (el propio nombre se cita a sí mismo), típico de la cultura de programadores desde los 90.

La diferencia con HTML y CSS es que esos dos los procesa tu navegador. PHP lo procesa el servidor, antes de que nada llegue a ti: el servidor ejecuta el código PHP, genera HTML normal como resultado, y ese HTML es lo único que ve tu navegador. Por eso, si haces clic derecho → "ver código fuente" en una página hecha con PHP, jamás vas a ver una línea de PHP, solo el HTML que ha generado.

Es gratuito, lleva más de 25 años en producción (WordPress, Wikipedia y buena parte de la web siguen corriendo sobre él) y aunque hoy hay alternativas como Node.js o Python, sigue siendo con diferencia el lenguaje de servidor más usado del mundo, así que la demanda de gente que lo sepa manejar no ha bajado.

Preparar tu entorno para PHP

Un archivo HTML se puede abrir directamente haciendo doble clic y ya lo ves en el navegador. Un archivo PHP no: necesita pasar por un servidor web que lo ejecute antes, así que antes de escribir una sola línea hay que tener ese servidor instalado y corriendo.

Cómo montar el entorno

La opción más directa para Windows es XAMPP: instala Apache, PHP y MySQL a la vez, sin tocar configuración por separado. Descárgalo desde apachefriends.org, instálalo (siguiente → siguiente → instalar) y arranca Apache desde el panel de control. Tienes la guía completa paso a paso, con capturas y solución a los errores típicos al arrancar Apache, en Instalar XAMPP en Windows (PHP, MySQL y phpMyAdmin).

Si estás en Linux, te ahorras el instalador:

Terminal 📋
sudo apt install apache2 php
sudo systemctl start apache2

Tus archivos van en /var/www/html/. Y si de momento no quieres instalar nada, editores online como PHPFiddle o Replit te dejan escribir y ejecutar PHP directamente desde el navegador, útil para probar código suelto, aunque para este tutorial te recomiendo XAMPP porque más adelante vas a necesitar MySQL en el mismo sitio.

Tu primer código PHP paso a paso

Con XAMPP instalado y Apache arrancado (luz verde en el panel de control), crea una carpeta nueva dentro de htdocs llamada mi-primer-php (en Windows, C:\xampp\htdocs\mi-primer-php; en Mac, /Applications/XAMPP/htdocs/mi-primer-php; en Linux, /opt/lampp/htdocs/mi-primer-php). Dentro, crea un archivo llamado mi-primera-pagina.php y ábrelo con tu editor (VS Code va perfecto) con este código:

<?php
// Esto es un comentario - PHP empieza con <?php
echo "¡Hola mundo desde PHP!";
// echo significa "mostrar en pantalla"
?>

Con Apache corriendo, ve al navegador y escribe localhost/mi-primer-php/mi-primera-pagina.php. Deberías ver el texto en pantalla.

Aquí es donde casi todo el mundo se atasca la primera vez: abren el archivo haciendo doble clic desde el explorador de archivos, en vez de escribir la URL con localhost. Si haces eso, el navegador te enseña el código PHP tal cual, sin ejecutarlo, porque estás abriendo el archivo directamente en vez de pedírselo al servidor. El código PHP solo se procesa cuando pasa por Apache, y Apache solo entra en juego cuando la URL empieza por localhost.

Si aun así no ves nada: comprueba que Apache sigue con la luz verde en XAMPP (a veces se para solo si otro programa está usando el puerto 80), que el archivo está dentro de htdocs y que termina en .php, no en .html. Una pantalla completamente en blanco casi siempre es un error de sintaxis, revisa que no te falte un punto y coma o una llave.

Variables: guardar información

<?php
// Las variables en PHP empiezan con $
$nombre = "Juan";           // Esto es un string (texto)
$edad = 20;                 // Esto es un número entero
$altura = 1.75;             // Esto es un número decimal
$esEstudiante = true;       // Esto es un booleano (verdadero/falso)

// Mostrar las variables
echo "Hola, soy " . $nombre;
echo "<br>";  // <br> es un salto de línea en HTML
echo "Tengo " . $edad . " años";
?>

El punto (.) es el operador de concatenación de PHP: une textos y variables en una sola cadena. "Hola " . $nombre da como resultado "Hola Juan". Si vienes de JavaScript, aquí es fácil liarse, porque ahí se usa + para lo mismo, y en PHP el + es solo para sumar números.

Fíjate en que en ningún momento has escrito de qué tipo es cada variable. PHP no te obliga a declarar si $edad es un número o $nombre es texto: lo decide él solo al ver el valor que le pones, y si más adelante metes otra cosa distinta en esa misma variable, PHP no protesta, simplemente cambia de tipo sobre la marcha. Esto se llama tipado dinámico, y es cómodo para empezar, pero tiene un precio: si un dato que esperabas que fuera número resulta ser texto (por ejemplo, porque viene de un formulario), PHP no te avisa hasta que intentas usarlo de una forma que no encaja. Vas a ver un caso real de esto en el ejercicio de la calculadora, más abajo.

Tomar decisiones con if/else

Con variables ya puedes guardar datos, pero un programa de verdad necesita reaccionar según esos datos. Para eso está if (si), else (si no) y, cuando hay más de dos casos, else if encadenados:

<?php
$nota = 7;

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

PHP compara con los operadores habituales: == igual, != distinto, < y > menor/mayor, <= y >= menor/mayor o igual. Para combinar condiciones se usa && (y, las dos tienen que cumplirse) y || (o, con que se cumpla una vale): por ejemplo, $edad >= 18 && $tieneCarnet solo deja pasar a quien cumple las dos cosas a la vez.

❌ Error común: usar = en vez de ==

Dentro del if, $edad = 18 no compara nada, asigna 18 a $edad. El resultado de una asignación en PHP siempre se evalúa como verdadero, así que ese if se cumple siempre, sea cual sea el valor que tuviera antes. Un solo carácter de diferencia y el bug es silencioso: no da error, simplemente hace algo distinto de lo que querías.

Mezclar HTML con PHP

Hasta ahora todo el código ha sido PHP puro. En la práctica casi nunca es así: PHP se escribe dentro de un archivo HTML normal, entrando y saliendo del modo PHP con <?php y ?> tantas veces como haga falta. El siguiente ejemplo además usa un bucle for, que repite un bloque de código un número concreto de veces: for ($i = 1; $i <= 5; $i++) se lee como "empieza con $i en 1, repite mientras $i sea menor o igual que 5, y suma 1 a $i en cada vuelta", así que el bloque de dentro se ejecuta exactamente 5 veces.

<!DOCTYPE html>
<html>
<head>
    <title>Mi página con PHP</title>
</head>
<body>
    <h1>Bienvenido a mi página</h1>
    
    <?php
    $nombre = "Ana";
    $fechaHoy = date("d/m/Y");  // Función que obtiene la fecha de hoy
    ?>
    
    <p>Hola <?php echo $nombre; ?>, hoy es <?php echo $fechaHoy; ?></p>
    
    <p>Aquí tienes algunos números aleatorios:</p>
    <ul>
        <?php
        // Bucle for para mostrar 5 números aleatorios
        for ($i = 1; $i <= 5; $i++) {
            $numeroAleatorio = rand(1, 100);  // Número entre 1 y 100
            echo "<li>Número " . $i . ": " . $numeroAleatorio . "</li>";
        }
        ?>
    </ul>
</body>
</html>

Conectar PHP con formularios HTML

Todo lo anterior ha sido código que tú mismo escribes en las variables. Lo interesante empieza cuando el dato lo escribe otra persona, por ejemplo, rellenando un formulario. PHP recibe ese dato a través de una variable especial, $_POST, que necesita dos archivos: el formulario en HTML (formulario.html) y el script PHP que procesa lo que se ha enviado (procesar.php).

<!DOCTYPE html>
<html>
<head>
    <title>Formulario de contacto</title>
</head>
<body>
    <h2>Cuéntanos sobre ti</h2>
    <form action="procesar.php" method="POST">
        <label>Tu nombre:</label>
        <input type="text" name="nombre" required><br><br>
        
        <label>Tu edad:</label>
        <input type="number" name="edad" required><br><br>
        
        <label>Tu ciudad:</label>
        <input type="text" name="ciudad" required><br><br>
        
        <button type="submit">Enviar información</button>
    </form>
</body>
</html>

Y en procesar.php, el destino del action del formulario:

<?php
// Verificar si el formulario fue enviado
if ($_POST) {
    $nombre = $_POST['nombre'];     // Obtener el nombre
    $edad = $_POST['edad'];         // Obtener la edad
    $ciudad = $_POST['ciudad'];     // Obtener la ciudad
    
    // htmlspecialchars() convierte < > " ' en su versión de texto inofensiva
    // antes de mostrar en pantalla cualquier dato que venga de un formulario
    $nombre = htmlspecialchars($nombre);
    $ciudad = htmlspecialchars($ciudad);

    // Mostrar la información recibida
    echo "<h2>¡Información recibida!</h2>";
    echo "<p>Nombre: " . $nombre . "</p>";
    echo "<p>Edad: " . $edad . " años</p>";
    echo "<p>Ciudad: " . $ciudad . "</p>";

    // Crear un mensaje personalizado según la edad
    if ($edad < 18) {
        echo "<p>Eres menor de edad</p>";
    } else if ($edad >= 18 && $edad < 30) {
        echo "<p>Edad perfecta para empezar a programar</p>";
    } else {
        echo "<p>Nunca es tarde para aprender</p>";
    }
} else {
    echo "<p>No se han recibido datos del formulario.</p>";
}
?>

⚠️ Por qué está ahí ese htmlspecialchars():

Si ese formulario estuviera en internet de verdad y no pasaras $nombre por htmlspecialchars() antes de mostrarlo, alguien podría escribir código en el campo "nombre" (por ejemplo, una etiqueta <script>) y que se ejecutara en tu página cuando la vieras. htmlspecialchars() convierte los caracteres especiales de HTML en texto inofensivo, así que ese código se ve como texto plano en vez de ejecutarse. Es un hábito que hay que coger desde la primera vez que muestras un dato que no has escrito tú: lo verás aplicado en más sitios en PHP y MySQL CRUD.

Errores que se repiten siempre al empezar

Con el formulario ya tienes montado el flujo completo: HTML que pide datos, PHP que los recibe y los procesa. Es también el punto en el que la sintaxis empieza a fallar más, porque ya estás escribiendo bloques de código más largos. Además del = en vez de == de antes, hay tres errores que vas a cometer seguro las primeras veces, y está bien, forman parte de aprender el lenguaje.

Olvidar el $ delante de una variable es el más frecuente de todos, viniendo de otros lenguajes donde no hace falta:

// ❌ MAL
nombre = "Juan";

// ✅ BIEN
$nombre = "Juan";

Usar + para concatenar en vez de ., ya lo has visto antes, pero se te va a volver a escapar más de una vez mientras el reflejo de PHP no esté asentado:

// ❌ MAL (esto es JavaScript, no PHP)
echo "Hola " + $nombre;

// ✅ BIEN (en PHP se usa el punto)
echo "Hola " . $nombre;

Y escribir <php sin el signo de interrogación. Parece una tontería, pero sin ese ? el servidor no reconoce que ahí empieza un bloque PHP y te devuelve el texto tal cual, sin ejecutar nada:

// ❌ MAL
<php
echo "Hola";

// ✅ BIEN
<?php
echo "Hola";

Ejercicio: una calculadora con formulario

Monta una calculadora básica: un formulario HTML con dos números y una operación (suma, resta, multiplicación o división), y un script PHP que reciba esos datos por $_POST, haga el cálculo y muestre el resultado.

Usa dos archivos, calculadora.html y calcular.php, con los campos del formulario llamados numero1 y numero2. Cuidado con la división entre cero: compruébalo antes de dividir, o PHP te va a lanzar un error de división por cero en vez de un resultado.

Ver la solución (inténtalo tú primero)

calculadora.html:

<!DOCTYPE html>
<html>
<head>
    <title>Calculadora PHP</title>
</head>
<body>
    <h2>Calculadora Simple</h2>
    <form action="calcular.php" method="POST">
        <label>Primer número:</label>
        <input type="number" name="numero1" required><br><br>
        
        <label>Segundo número:</label>
        <input type="number" name="numero2" required><br><br>
        
        <label>Operación:</label>
        <select name="operacion">
            <option value="+">Sumar (+)</option>
            <option value="-">Restar (-)</option>
            <option value="*">Multiplicar (×)</option>
            <option value="/">Dividir (÷)</option>
        </select><br><br>
        
        <button type="submit">Calcular</button>
    </form>
</body>
</html>

calcular.php:

<?php
if ($_POST) {
    // (float) convierte el texto que llega del formulario en número
    // sin este casteo, PHP 8 lanza TypeError al intentar sumar strings
    $numero1 = (float) $_POST['numero1'];
    $numero2 = (float) $_POST['numero2'];
    $operacion = $_POST['operacion'];

    // Realizar el cálculo según la operación
    if ($operacion == "+") {
        $resultado = $numero1 + $numero2;
    } else if ($operacion == "-") {
        $resultado = $numero1 - $numero2;
    } else if ($operacion == "*") {
        $resultado = $numero1 * $numero2;
    } else if ($operacion == "/") {
        if ($numero2 != 0) {
            $resultado = $numero1 / $numero2;
        } else {
            $resultado = "Error: No se puede dividir por cero";
        }
    }
    
    // Mostrar el resultado
    echo "<h2>Resultado</h2>";
    echo "<p>" . $numero1 . " " . $operacion . " " . $numero2 . " = " . $resultado . "</p>";
    echo "<a href='calculadora.html'>Hacer otro cálculo</a>";
} else {
    echo "<p>No se recibieron datos para calcular.</p>";
}
?>

Fíjate en el (float) delante de cada $_POST: todo lo que llega de un formulario en PHP es texto, aunque el campo sea de tipo number en el HTML. Si intentas sumar dos strings directamente suele funcionar por la conversión automática de PHP, pero en cuanto ese texto no es un número limpio (espacios, una coma en vez de un punto), en PHP 8 salta un TypeError en vez de un resultado. Castear a float en cuanto entra el dato evita ese problema desde el principio.

Con esto ya tienes PHP básico. Qué sigue

Ya puedes escribir lógica, mostrar datos y recibir información de un formulario, que es la base de cualquier cosa que construyas después. Lo que le falta a este código para ser una aplicación real es guardar los datos en algún sitio: ahora mismo, si cierras el navegador, todo lo que escribiste en el formulario desaparece. Si quieres profundizar en cómo se combinan require, POST y GET en una aplicación real, tenemos una guía dedicada a los fundamentos de PHP con require, POST y GET.

El siguiente paso natural es conectar PHP con una base de datos MySQL, para que esa información persista de verdad. Lo ves completo en PHP y MySQL CRUD (primera base de datos conectada). Después, cuando quieras que los usuarios puedan registrarse y mantener sesión iniciada, sigue con PHP Sessions, Cookies y sistema de login funcional.

Más adelante, cuando el proyecto lo pida, tienes subida de archivos con validación segura, enviar emails desde PHP con PHPMailer, y antes de saltar a un framework como Laravel, vale la pena entender Composer, el gestor de dependencias de PHP.

💼 Por qué merece la pena seguir con esto

PHP lo usa el 71.8% de los sitios web cuyo lenguaje de programación del lado del servidor se conoce, muy por delante de cualquier alternativa (fuente: W3Techs, agosto 2026). No es el lenguaje de moda, pero es el que más ofertas de backend junior mueve en España.

¿Te gustó este tutorial?

Únete a StudyCode Pro para más tutoriales como este, roadmaps completos y acceso a nuestra comunidad de developers que te ayudará a conseguir tu primer trabajo en tech.

Únete Gratis