PHP es un lenguaje de programación pensado principalmente para crear páginas web dinámicas y aplicaciones web del lado del servidor.
Cuando un usuario entra en una web, normalmente el navegador recibe HTML, CSS y JavaScript. Pero antes de que eso llegue al navegador, muchas veces hay un servidor que tiene que hacer tareas como:
consultar una base de datos;
comprobar si el usuario ha iniciado sesión;
guardar formularios;
cargar productos;
gestionar reservas;
mostrar contenido diferente según el usuario;
generar páginas dinámicas.
Ahí es donde entra PHP.
PHP se ejecuta en el servidor, genera una respuesta —normalmente HTML— y se la envía al navegador del usuario.
El usuario no ve el código PHP. Solo ve el resultado:
<h1>Hola, Antonio</h1>
¿Por qué PHP sigue siendo importante?
PHP no es “el lenguaje moderno o de moda”, pero sigue siendo uno de los lenguajes más importantes de la web real. Según W3Techs, PHP se usa en aproximadamente el 71,2% de las webs cuyo lenguaje de servidor es conocido, muy por encima de otros lenguajes de servidor como Ruby, JavaScript, Java o ASP.NET.
Además, PHP sigue evolucionando. Actualmente las versiones mantenidas oficialmente incluyen PHP 8.4 y PHP 8.5, con soporte activo y de seguridad definido por el propio proyecto PHP.
Ideas clave
Idea
Explicación sencilla
PHP se usa en servidores
No se ejecuta normalmente en el navegador, sino en el servidor web.
PHP genera HTML dinámico
Puede crear páginas diferentes según datos, usuarios o formularios.
PHP trabaja muy bien con bases de datos
Es muy habitual usarlo con MySQL o MariaDB.
PHP está muy presente en hosting real
Muchos alojamientos web baratos o compartidos soportan PHP por defecto.
PHP mueve proyectos enormes
WordPress, Drupal, Moodle, MediaWiki, Magento y muchos CMS/plataformas usan PHP.
PHP tiene mucha salida práctica
Permite crear webs, paneles de administración, tiendas online, APIs y aplicaciones internas.
Comparativa rápida: PHP frente a otros lenguajes web
Lenguaje
Uso principal
Dónde se ejecuta normalmente
Dificultad inicial
Ventajas
Inconvenientes
PHP
Desarrollo web backend
Servidor
Baja / media
Fácil de empezar, mucho hosting compatible, ideal con MySQL, enorme ecosistema web
Hay mucho código antiguo mal escrito; requiere buenas prácticas desde el principio
JavaScript
Frontend y backend con Node.js
Navegador y servidor
Baja / media
Imprescindible en frontend, muy versátil, sirve para web completa
El ecosistema cambia muy rápido; puede ser caótico al principio
Python
Scripts, IA, automatización, backend
Servidor / escritorio
Baja
Muy legible, ideal para aprender, potente en datos e IA
En hosting web tradicional no siempre es tan directo como PHP
Java
Aplicaciones empresariales, backend robusto
Servidor / JVM
Media / alta
Muy usado en empresas, fuerte tipado, escalable
Más verboso, curva inicial mayor
C#
Aplicaciones Windows, backend con .NET, videojuegos con Unity
Servidor / escritorio / Unity
Media
Muy potente, moderno, buen entorno con Visual Studio
Menos habitual en hosting compartido clásico
Ruby
Backend web con Ruby on Rails
Servidor
Media
Muy productivo, elegante, Rails fue muy influyente
Menor presencia actual que PHP, JavaScript o Python
Go
Servicios backend, APIs, sistemas
Servidor
Media
Muy rápido, simple, ideal para microservicios
Menos orientado a principiantes web que PHP
TypeScript
JavaScript con tipos
Navegador y servidor
Media
Más ordenado que JavaScript, muy usado en proyectos modernos
Añade complejidad inicial
Comparativa: PHP, JavaScript y Python para aprender desarrollo web
Aspecto
PHP
JavaScript
Python
¿Sirve para crear páginas web dinámicas?
Sí
Sí
Sí
¿Se usa en el navegador?
No, normalmente
Sí, es el lenguaje principal del navegador
No, normalmente
¿Se usa en el servidor?
Sí
Sí, con Node.js
Sí, con frameworks como Django o Flask
¿Es fácil hacer una web básica?
Muy fácil
Fácil, pero necesita más piezas si usamos backend
Fácil, pero depende del framework
¿Funciona bien con MySQL?
Muy bien
Bien
Bien
¿Lo soportan muchos hostings baratos?
Sí, muchísimo
Depende
Depende
¿Tiene CMS famosos?
Sí: WordPress, Drupal, Joomla, Moodle
Menos en el sentido clásico
Menos en el sentido clásico
¿Es buena primera opción para backend web clásico?
Sí
Sí, si ya se domina JS
Sí, si se quiere ir hacia datos, IA o Django
Comparativa: PHP puro, WordPress y Laravel
Opción
Qué es
Cuándo usarlo
Ventajas
Limitaciones
PHP puro
Programar directamente con PHP sin framework
Para aprender fundamentos, formularios, sesiones, CRUD, conexión a BD
Se entiende cómo funciona todo por dentro
En proyectos grandes puede volverse desordenado si no se estructura bien
Alternativa a Google Analytics instalada en servidor propio
phpMyAdmin
Administración de bases de datos
Aplicación PHP para gestionar MySQL/MariaDB desde navegador
Gestión de bases de datos en hosting, servidores y laboratorios
Tabla: ¿Para qué se usa PHP en la vida real?
Caso de uso
Ejemplo práctico
Webs corporativas
Una empresa necesita una web editable con panel de administración.
Blogs y medios digitales
Un periódico, blog o revista online publica contenido todos los días.
Tiendas online
Catálogo de productos, carrito, pagos, usuarios y pedidos.
Aplicaciones internas
Panel para gestionar alumnos, reservas, incidencias o inventario.
Formularios web
Contacto, inscripción, encuestas, solicitudes.
APIs sencillas
Un frontend pide datos a un backend PHP en formato JSON.
Plataformas educativas
Moodle, campus virtuales, actividades, usuarios y calificaciones.
Wikis y documentación
MediaWiki para documentación colaborativa.
Plugins y temas
Desarrollo de extensiones para WordPress, WooCommerce o Moodle.
Comparativa de PHP según tipo de proyecto
Proyecto
¿PHP es buena opción?
Motivo
Blog personal
Sí
WordPress lo resuelve muy bien.
Web corporativa
Sí
Rápido, económico y fácil de alojar.
Tienda online pequeña
Sí
WooCommerce o PrestaShop son opciones habituales.
Tienda online grande
Sí, con cuidado
Magento/Adobe Commerce es potente, pero requiere buena infraestructura.
Aplicación CRUD de gestión
Sí
PHP con Laravel o Symfony encaja muy bien.
API REST
Sí
Laravel, Symfony o Slim permiten crear APIs profesionales.
Aplicación de IA
No como primera opción
Python suele ser mejor para IA, aunque PHP puede consumir APIs de IA.
Videojuegos
No
Mejor C#, C++, JavaScript o motores como Unity/Unreal.
Aplicación móvil nativa
No directamente
PHP puede servir como backend, pero no como app móvil nativa.
Panel de administración
Sí
Es uno de sus usos más habituales.
PHP no es importante porque sea “el lenguaje más moderno” o “el más elegante”. PHP es importante porque resuelve problemas reales de la web y porque sigue estando instalado en millones de servidores.
Aprender PHP permite entender muy bien cómo funciona una aplicación web clásica:
Concepto
Qué aprenderán con PHP
Cliente-servidor
El navegador pide una página y el servidor responde.
Formularios
El usuario envía datos al servidor.
Bases de datos
PHP consulta, guarda, modifica y borra información.
Sesiones
El servidor recuerda qué usuario ha iniciado sesión.
Separar lógica, vistas, modelos, controladores y configuración.
Despliegue
Subir una aplicación a un hosting o servidor real.
:
“PHP es uno de los lenguajes que más ha construido la web que usamos cada día. Aunque hoy existen muchas alternativas, PHP sigue siendo fundamental porque está detrás de herramientas enormes como WordPress, Moodle, Drupal, MediaWiki o Magento. Aprender PHP nos permite entender cómo funciona una aplicación web desde dentro: cómo se reciben datos, cómo se conecta con una base de datos, cómo se gestionan usuarios y cómo se genera una página dinámica. No vamos a aprender PHP solo para escribir código, sino para entender cómo se construye una web real.”
PHP y empleo
PHP tiene salida laboral porque hay muchísimas webs, tiendas online, CMS, plataformas educativas y aplicaciones empresariales creadas con PHP. No todo el trabajo consiste en crear proyectos nuevos desde cero; una parte muy grande del empleo tecnológico consiste en mantener, mejorar, migrar y ampliar sistemas que ya existen.
Tabla: salidas laborales relacionadas con PHP
Perfil profesional
Qué hace
Tecnologías habituales
Desarrollador PHP Junior
Crea funcionalidades básicas, corrige errores, trabaja con formularios, bases de datos y paneles web
PHP, MySQL, HTML, CSS, JavaScript
Desarrollador WordPress
Crea webs, personaliza temas, instala y adapta plugins, optimiza rendimiento
WordPress, PHP, MySQL, CSS, JavaScript
Desarrollador Laravel
Crea aplicaciones web modernas, APIs, paneles de gestión y sistemas CRUD
PHP, Laravel, MySQL, Composer, Git
Desarrollador Symfony
Trabaja en aplicaciones más estructuradas o empresariales
PHP, Symfony, Doctrine, Twig, APIs
Desarrollador Full Stack PHP
Trabaja tanto en backend como en frontend
PHP, Laravel/Symfony, JavaScript, Vue/React, MySQL
Técnico web / Webmaster
Mantiene webs, hosting, dominios, CMS, seguridad básica y contenidos
WordPress, PHP, hosting, FTP/SFTP, bases de datos
Desarrollador e-commerce
Crea y mantiene tiendas online
WooCommerce, PrestaShop, Magento, PHP, pasarelas de pago
Mantenimiento de aplicaciones legacy
Actualiza sistemas antiguos, corrige errores y migra código
PHP antiguo, MySQL, jQuery, Bootstrap, Git
Backend Developer PHP
Crea lógica de servidor, APIs, autenticación y conexión con bases de datos
PHP, Laravel/Symfony, SQL, REST APIs
Tabla: tecnologías que suelen acompañar a PHP en ofertas de empleo
Tecnología
Por qué es importante
HTML
PHP suele generar páginas web, así que hay que entender la estructura.
CSS
Necesario para maquetar y adaptar interfaces.
JavaScript
Imprescindible para añadir interacción en el navegador.
MySQL / MariaDB
Es la base de datos más habitual junto a PHP.
Git / GitHub / GitLab
Casi cualquier empresa lo usa para controlar versiones.
Composer
Gestor de dependencias de PHP. Muy importante en proyectos modernos.
Laravel
Uno de los frameworks PHP más demandados.
Symfony
Muy usado en proyectos profesionales y empresariales.
WordPress
Muy importante para empleo en agencias, marketing, diseño web y mantenimiento.
Docker
Cada vez más habitual para entornos de desarrollo y despliegue.
APIs REST
Muchas aplicaciones PHP comunican frontend, móviles o servicios externos mediante APIs.
“PHP sigue teniendo empleo porque una parte enorme de la web funciona con PHP. No solo hablamos de WordPress, también de tiendas online, plataformas educativas, paneles de gestión, APIs y aplicaciones internas de empresas. Ahora bien, aprender PHP no significa memorizar cuatro etiquetas. Para ser empleable hay que aprender a construir aplicaciones completas: formularios, bases de datos, login, seguridad, Git, despliegue y, más adelante, frameworks como Laravel o Symfony.”
echo "<h1>$titulo</h1>"; echo "<p>Esta página ha sido generada usando $lenguaje.</p>"; echo "<p>El código PHP se ha ejecutado en el servidor.</p>"; echo "<p>Servidor utilizado: $servidor</p>"; ?>
Después responde:
Pregunta
Respuesta
¿Dónde se ejecuta el código PHP?
¿Qué recibe finalmente el navegador?
¿Se puede ver el código PHP desde “Inspeccionar elemento”?
¿Qué diferencia hay entre HTML y PHP?
¿Qué papel cumple Apache o Nginx?
La arquitectura cliente-servidor es la base de las aplicaciones web.
El cliente solicita información mediante el navegador.
El servidor procesa la petición.
PHP se ejecuta en el servidor, puede consultar bases de datos y genera una respuesta que normalmente se envía al navegador como HTML.
Por eso PHP es una pieza fundamental en muchas aplicaciones web dinámicas, como blogs, tiendas online, paneles de administración, sistemas de reservas o plataformas educativas.
Antes de empezar a programar con PHP necesitamos preparar un entorno de trabajo. PHP no funciona igual que HTML o CSS, donde podemos abrir directamente el archivo en el navegador. En PHP necesitamos un servidor que interprete el código y devuelva al navegador el resultado generado.
Cuando escribimos una página en PHP, el navegador no ejecuta directamente ese código. El proceso habitual es el siguiente:
El usuario accede a una dirección desde el navegador.
El navegador hace una petición al servidor web.
El servidor localiza el archivo PHP solicitado.
PHP interpreta el código del archivo.
El servidor devuelve al navegador una página HTML generada.
El navegador muestra el resultado final al usuario.
Por este motivo, para trabajar cómodamente durante el aprendizaje vamos a utilizar un entorno local. Esto nos permitirá tener en nuestro propio ordenador todo lo necesario para probar nuestras aplicaciones web sin depender de un servidor externo.
Entornos locales preparados
Existen herramientas que instalan de forma sencilla los elementos básicos que necesitamos para trabajar con PHP. Algunas de las más conocidas son:
Herramienta
Sistemas habituales
Incluye normalmente
Uso principal
XAMPP
Windows, Linux y macOS
Apache, PHP, MariaDB/MySQL y phpMyAdmin
Muy usado en formación y pruebas locales
MAMP
macOS y Windows
Apache o Nginx, PHP, MySQL y herramientas de gestión
Muy cómodo en equipos Mac
WAMP
Windows
Apache, PHP y MySQL/MariaDB
Alternativa clásica para Windows
Laragon
Windows
Apache/Nginx, PHP, MySQL y otras herramientas
Entorno ligero y flexible para desarrollo
Estas herramientas nos permiten arrancar un servidor web en nuestro propio equipo. De esta forma podremos guardar nuestros archivos PHP en una carpeta concreta del entorno y acceder a ellos desde el navegador usando direcciones como:
http://localhost/
o, según la configuración:
http://localhost/mi_proyecto/
La palabra localhost hace referencia a nuestro propio ordenador. Es decir, estamos usando nuestro equipo como si fuera un pequeño servidor web local.
Por qué no usaremos inicialmente las integraciones de los IDE
Muchos editores e IDEs modernos permiten ejecutar PHP directamente desde sus propias herramientas, extensiones o servidores integrados. Por ejemplo, algunos entornos permiten lanzar un servidor interno, depurar código o conectar directamente con bases de datos.
Aunque estas opciones son útiles, al principio no las vamos a utilizar como base principal. El motivo es que queremos entender claramente cómo funciona una aplicación PHP en un entorno realista:
dónde se colocan los archivos del proyecto;
qué papel tiene el servidor web;
cómo se comunica el navegador con el servidor;
cómo se interpreta el código PHP;
cómo se conecta PHP con una base de datos;
cómo se accede a una aplicación desde una URL.
Usar herramientas como XAMPP o MAMP nos ayuda a ver el proceso completo de forma más clara. El IDE será nuestro editor de código, pero no queremos que oculte el funcionamiento real del servidor.
Por tanto, podremos usar editores como Visual Studio Code, PhpStorm, Eclipse, NetBeans u otros, pero el servidor será externo al IDE. Así entenderemos mejor la arquitectura real de una aplicación web.
Trabajar directamente en un servidor
Otra posibilidad es trabajar directamente sobre un servidor remoto. En este caso, los archivos PHP no se ejecutan en nuestro ordenador, sino en una máquina conectada a la red o a Internet.
Por ejemplo, podríamos tener un servidor con Linux, Apache, PHP y MySQL instalado. Subiríamos nuestros archivos mediante FTP, SFTP, Git o alguna herramienta similar, y probaríamos la aplicación desde el navegador accediendo a la dirección del servidor.
Este enfoque se parece más a un entorno de producción, pero también tiene algunos inconvenientes para empezar:
es más fácil cometer errores que afecten a una aplicación real;
dependemos de la conexión con el servidor;
la configuración inicial puede ser más compleja;
es menos cómodo para hacer pruebas rápidas;
puede ser más difícil depurar errores al principio.
Aun así, es importante conocer esta forma de trabajo, porque muchas aplicaciones PHP se despliegan finalmente en servidores reales.
Trabajar con contenedores
Más adelante también podremos trabajar con contenedores, especialmente usando Docker. Esta forma de trabajo permite crear entornos aislados donde cada servicio se ejecuta en su propio contenedor.
Por ejemplo, una aplicación PHP podría tener varios contenedores:
Contenedor
Función
Apache o Nginx
Servidor web
PHP
Interpretación del código PHP
MySQL o MariaDB
Base de datos
phpMyAdmin
Gestión visual de la base de datos
La ventaja de los contenedores es que podemos definir todo el entorno en archivos de configuración. Así, cualquier alumno o desarrollador puede levantar el mismo entorno en su equipo con los mismos servicios y versiones.
En este curso empezaremos usando entornos locales como XAMPP o MAMP porque son más directos para aprender. Más adelante veremos cómo llevar estos conocimientos a entornos más profesionales usando servidores reales y contenedores.
Idea principal
Para aprender PHP correctamente no basta con escribir código. También necesitamos entender el entorno donde ese código se ejecuta.
PHP forma parte de una arquitectura cliente-servidor. El navegador actúa como cliente, el servidor procesa la petición, PHP genera el contenido dinámico y la base de datos almacena la información.
Por eso, durante las primeras prácticas trabajaremos con un servidor local instalado en nuestro propio ordenador. Esto nos permitirá aprender paso a paso cómo funciona una aplicación web antes de pasar a escenarios más avanzados como servidores remotos o contenedores Docker.
Instalación de XAMPP
1. ¿Qué es XAMPP?
XAMPP es un paquete de software que nos permite instalar de forma sencilla un entorno de servidor web en nuestro propio ordenador.
Cuando trabajamos con PHP no basta con abrir el archivo directamente en el navegador, como haríamos con un archivo HTML. PHP necesita ser interpretado por un servidor. XAMPP nos proporciona ese entorno de trabajo local para poder practicar y desarrollar aplicaciones web.
XAMPP incluye normalmente los siguientes componentes:
Componente
Función
Apache
Servidor web que recibe las peticiones del navegador
PHP
Lenguaje que interpreta los archivos .php
MariaDB / MySQL
Sistema de base de datos
phpMyAdmin
Herramienta web para gestionar bases de datos
Perl
Otro lenguaje incluido en el paquete
En este curso usaremos XAMPP como entorno local para aprender PHP de forma sencilla antes de pasar a entornos más avanzados como servidores reales o contenedores Docker.
2. Descargar XAMPP
Para descargar XAMPP debemos acceder a la página oficial:
https://www.apachefriends.org/es/download.html
Es recomendable descargar siempre XAMPP desde la página oficial de Apache Friends para evitar instaladores modificados o versiones no fiables.
3. Instalación de XAMPP en Windows
3.1. Descargar el instalador
Desde la página oficial descargamos la versión de XAMPP para Windows.
El archivo descargado tendrá un nombre parecido a este:
xampp-windows-x64-8.x.x-installer.exe
El número de versión puede cambiar dependiendo de la versión disponible en ese momento.
3.2. Ejecutar el instalador
Una vez descargado el archivo, hacemos doble clic sobre él para iniciar la instalación.
Es posible que Windows muestre una advertencia de seguridad o de permisos. En ese caso, aceptamos la ejecución si hemos descargado el archivo desde la página oficial.
También puede aparecer una advertencia relacionada con el control de cuentas de usuario de Windows. Para evitar problemas de permisos, es recomendable instalar XAMPP directamente en:
C:\xampp
No es recomendable instalarlo dentro de Archivos de programa, ya que puede dar problemas de permisos al trabajar con archivos del servidor.
3.3. Seleccionar componentes
Durante la instalación aparecerá una pantalla para seleccionar los componentes.
Para este curso podemos dejar marcados, como mínimo:
Apache
MySQL o MariaDB
PHP
phpMyAdmin
También pueden aparecer otros componentes como Perl, Tomcat, Mercury o FileZilla. Para empezar con PHP no son imprescindibles.
3.4. Elegir carpeta de instalación
Seleccionamos como carpeta de instalación:
C:\xampp
Esta será la carpeta principal donde se instalará XAMPP.
Dentro de esta carpeta encontraremos subcarpetas importantes como:
Carpeta
Función
apache
Archivos del servidor Apache
mysql
Archivos relacionados con la base de datos
php
Archivos del intérprete PHP
htdocs
Carpeta donde colocaremos nuestros proyectos web
3.5. Finalizar la instalación
Continuamos con el asistente hasta finalizar.
Al terminar, podemos marcar la opción para abrir el panel de control de XAMPP.
6. El panel de control de XAMPP
Una vez instalado XAMPP, podemos abrir su panel de control.
Desde este panel podremos iniciar y detener los servicios principales.
Los servicios que más usaremos al principio son:
Servicio
Para qué sirve
Apache
Permite ejecutar páginas PHP desde el navegador
MySQL / MariaDB
Permite trabajar con bases de datos
phpMyAdmin
Permite administrar las bases de datos desde el navegador
Para trabajar con PHP debemos iniciar como mínimo:
Apache
Si nuestra aplicación usa base de datos, también debemos iniciar:
MySQL o MariaDB
7. Comprobar que XAMPP funciona
Una vez iniciado Apache, abrimos el navegador y escribimos:
http://localhost
Si XAMPP está funcionando correctamente, veremos la página de bienvenida o panel inicial de XAMPP.
Esto significa que nuestro ordenador ya está funcionando como servidor web local.
8. Carpeta donde se guardan los proyectos
La carpeta más importante para empezar es htdocs.
En Windows suele estar en:
C:\xampp\htdocs
En macOS suele estar en:
/Applications/XAMPP/htdocs
En Linux suele estar en:
/opt/lampp/htdocs
Todo lo que coloquemos dentro de esa carpeta podrá abrirse desde el navegador usando localhost.
9. Crear nuestro primer proyecto PHP
Dentro de la carpeta htdocs, creamos una carpeta llamada:
mi_proyecto
Dentro de esa carpeta creamos un archivo llamado:
index.php
La estructura quedaría así:
htdocs/
└── mi_proyecto/
└── index.php
Dentro del archivo index.php escribimos:
<?php
echo "Hola, estoy ejecutando PHP con XAMPP";
?>
Guardamos el archivo.
Después abrimos el navegador y escribimos:
http://localhost/mi_proyecto/index.php
Si todo está correcto, veremos en pantalla:
Hola, estoy ejecutando PHP con XAMPP
10. Probar PHP dentro de HTML
También podemos mezclar HTML y PHP dentro del mismo archivo.
Modificamos el archivo index.php con este contenido:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Primera prueba con PHP</title>
</head>
<body>
<h1>Mi primera página con PHP</h1>
<p>Este texto está escrito en HTML.</p>
<p>
<?php
echo "Este texto ha sido generado por PHP.";
?>
</p>
</body>
</html>
Al abrir de nuevo:
http://localhost/mi_proyecto/index.php
veremos una página HTML normal, pero parte de su contenido habrá sido generado por PHP.
11. Crear una página de información de PHP
PHP tiene una función muy útil para comprobar la configuración instalada:
Aparecerá una página con información sobre la versión de PHP, configuración, extensiones activas y otros datos del entorno.
Esta página es útil para comprobar que PHP funciona correctamente.
Importante: en proyectos reales no se debe dejar publicado un archivo phpinfo(), porque muestra demasiada información del servidor.
12. Acceder a phpMyAdmin
Si hemos iniciado Apache y MySQL/MariaDB desde el panel de control de XAMPP, podemos acceder a phpMyAdmin desde el navegador:
http://localhost/phpmyadmin
phpMyAdmin nos permite gestionar bases de datos desde una interfaz web.
Desde ahí podremos:
crear bases de datos;
crear tablas;
insertar datos;
modificar registros;
ejecutar consultas SQL;
importar y exportar bases de datos.
Más adelante usaremos esta herramienta para conectar nuestras aplicaciones PHP con una base de datos.
13. Problemas frecuentes
Apache no arranca
Uno de los problemas más habituales es que Apache no pueda iniciarse porque el puerto 80 ya está ocupado.
El puerto 80 puede estar siendo usado por otros programas como:
IIS de Windows;
Skype;
Docker;
otro servidor web;
alguna herramienta de desarrollo.
Soluciones posibles:
Cerrar el programa que está usando el puerto 80.
Cambiar el puerto de Apache.
Ejecutar XAMPP como administrador en Windows.
Si cambiamos Apache al puerto 8080, accederíamos así:
http://localhost:8080
Y nuestros proyectos se abrirían así:
http://localhost:8080/mi_proyecto/index.php
MySQL o MariaDB no arranca
Puede ocurrir que la base de datos no arranque porque el puerto 3306 esté ocupado.
Ese puerto puede estar siendo usado por otra instalación de MySQL o MariaDB.
Soluciones posibles:
Detener el otro servicio de MySQL/MariaDB.
Cambiar el puerto de la base de datos en XAMPP.
Reiniciar el equipo y probar de nuevo.
Revisar los logs desde el panel de control.
El navegador muestra el código PHP en lugar del resultado
Si al abrir un archivo PHP vemos el código escrito en pantalla, normalmente significa que estamos abriendo el archivo directamente desde el sistema de archivos.
Ejemplo incorrecto:
file:///C:/xampp/htdocs/mi_proyecto/index.php
Forma correcta:
http://localhost/mi_proyecto/index.php
Los archivos PHP deben ejecutarse a través del servidor, no abrirse directamente como archivos locales.
Error 404 al abrir el proyecto
Un error 404 significa que el servidor no encuentra el archivo o carpeta que estamos solicitando.
Debemos comprobar:
que Apache está iniciado;
que la carpeta del proyecto está dentro de htdocs;
que el nombre de la carpeta está bien escrito;
que el archivo index.php existe;
que la URL coincide con la estructura real.
Por ejemplo, si tenemos:
C:\xampp\htdocs\mi_proyecto\index.php
la URL correcta será:
http://localhost/mi_proyecto/index.php
14. Buenas prácticas para organizar proyectos
Dentro de htdocs podemos crear una carpeta para cada proyecto.
El proceso básico para trabajar con XAMPP será siempre parecido:
Abrir XAMPP.
Iniciar Apache.
Iniciar MySQL/MariaDB si vamos a usar base de datos.
Crear una carpeta de proyecto dentro de htdocs.
Crear archivos .php.
Abrir el proyecto desde el navegador usando localhost.
Comprobar el resultado.
Corregir el código y volver a probar.
La idea principal es entender que PHP no se ejecuta en el navegador. PHP se ejecuta en el servidor local que nos proporciona XAMPP. El navegador solo recibe el resultado final, normalmente HTML.
16. Actividad propuesta para el alumno
Objetivo
Comprobar que XAMPP está correctamente instalado y que PHP funciona en el equipo.
Pasos
Instala XAMPP en tu sistema operativo.
Abre el panel de control de XAMPP.
Inicia Apache.
Abre en el navegador:
http://localhost
Crea una carpeta dentro de htdocs llamada:
prueba_php
Dentro de esa carpeta crea un archivo llamado:
index.php
Escribe el siguiente código:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Prueba PHP</title>
</head>
<body>
<h1>Prueba de XAMPP y PHP</h1>
<p>
<?php
echo "PHP está funcionando correctamente.";
?>
</p>
</body>
</html>
Abre en el navegador:
http://localhost/prueba_php/index.php
Comprueba que se muestra correctamente el mensaje.
Preguntas de reflexión
¿Por qué no podemos abrir un archivo PHP directamente con doble clic?
¿Qué papel cumple Apache dentro de XAMPP?
¿Qué diferencia hay entre abrir localhost y abrir un archivo con file:///?
¿Dónde debemos guardar nuestros proyectos PHP?
¿Para qué sirve phpMyAdmin?
¿Qué ocurre si Apache no está iniciado?
17. Conclusión
XAMPP nos permite disponer de un entorno de desarrollo local para aprender y practicar PHP sin necesidad de contratar un servidor externo.
Gracias a XAMPP podemos simular en nuestro propio ordenador el funcionamiento básico de una aplicación web real: el navegador hace una petición, Apache la recibe, PHP interpreta el código y el navegador muestra el resultado final.
Este entorno será la base inicial del curso. Más adelante podremos comparar esta forma de trabajo con otras opciones más avanzadas, como servidores remotos, máquinas virtuales o contenedores Docker.
Cuando empezamos a programar en PHP, una de las primeras decisiones que tenemos que tomar es qué herramienta vamos a utilizar para escribir nuestro código. Existen IDEs muy completos, como PhpStorm, NetBeans o Eclipse PDT, pero para un curso desde cero una de las opciones más equilibradas es Visual Studio Code.
Visual Studio Code, normalmente conocido como VS Code, es un editor de código gratuito, ligero, multiplataforma y muy flexible. No es un IDE exclusivo para PHP, pero gracias a sus extensiones puede convertirse en un entorno muy potente para desarrollar aplicaciones web.
En este artículo veremos por qué VS Code es una buena opción para trabajar con PHP, qué ventajas tiene para el aprendizaje y qué extensiones conviene instalar.
📹 Instalación VSCODE
¿Qué es Visual Studio Code?
Visual Studio Code es un editor de código desarrollado por Microsoft. Está disponible para Windows, macOS y Linux, por lo que resulta muy cómodo en un entorno educativo donde cada alumno puede tener un sistema operativo diferente.
A diferencia de otros IDEs más pesados, VS Code parte de una base sencilla y se puede ampliar mediante extensiones. Esto significa que podemos instalar solo lo que necesitamos para cada momento del curso.
Por ejemplo, en un proyecto PHP podemos trabajar con archivos como estos:
Desde VS Code podemos abrir toda la carpeta del proyecto y trabajar cómodamente con todos estos archivos.
📹 Mí primer Hola Mundo
¿Por qué usar VS Code para PHP?
PHP es un lenguaje que se ejecuta normalmente en un servidor web. Es decir, nosotros escribimos el código en archivos .php, pero para ver el resultado necesitamos ejecutarlo mediante un servidor como Apache, Nginx, el servidor integrado de PHP o un entorno como XAMPP, MAMP, Laragon o Docker.
VS Code encaja muy bien en este flujo porque nos permite escribir, organizar y revisar el código de forma clara.
El flujo básico sería:
Escribir código en VS Code ↓ Guardar el archivo PHP ↓ Ejecutarlo mediante un servidor ↓ Ver el resultado en el navegador ↓ Corregir errores y volver a probar
Esta forma de trabajar ayuda mucho al alumno, porque ve claramente qué papel cumple cada herramienta.
Herramienta
Función
VS Code
Escribir y organizar el código
PHP
Interpretar el código del servidor
Apache / Nginx / servidor PHP
Servir la aplicación web
Navegador
Mostrar el resultado
MySQL / MariaDB
Almacenar los datos
phpMyAdmin / DBeaver / DataGrip
Gestionar la base de datos
Ventajas de VS Code en un curso de PHP
Es gratuito
Una ventaja muy importante es que VS Code es gratuito. Esto permite que todos los alumnos puedan instalarlo sin depender de licencias.
Para un entorno educativo esto es fundamental, porque evita problemas económicos y facilita que todos trabajen con la misma herramienta.
Funciona en Windows, macOS y Linux
VS Code está disponible para los principales sistemas operativos. Esto nos permite usarlo en diferentes escenarios:
Sistema
Entorno PHP habitual
Windows
XAMPP, Laragon, Docker
macOS
MAMP, XAMPP, Docker, PHP instalado con Homebrew
Linux
Apache, Nginx, PHP, Docker
El editor será el mismo, aunque el servidor PHP pueda cambiar según el sistema operativo.
Es ligero y sencillo
VS Code no es tan pesado como un IDE completo. Esto hace que sea más rápido de instalar, abrir y utilizar.
Para alumnos que empiezan, esto es una ventaja importante. Una interfaz demasiado cargada puede distraer más que ayudar.
Con VS Code podemos empezar con algo muy simple:
<?php echo "Hola mundo desde PHP"; ?>
Y poco a poco ir avanzando hacia proyectos más completos.
Se adapta al nivel del alumno
Otra ventaja es que podemos ir añadiendo extensiones según avanza el curso.
Al principio podemos instalar solo lo básico. Más adelante, cuando trabajemos con bases de datos, Git, depuración o Docker, podremos añadir nuevas extensiones.
Esto permite que el alumno no se vea saturado desde el primer día.
VS Code no ejecuta PHP por sí solo
Este punto es muy importante.
VS Code sirve para escribir código, pero no sustituye al servidor PHP.
Para ejecutar un archivo PHP necesitamos tener PHP instalado y, normalmente, trabajar con un servidor web.
No basta con abrirlo directamente en el navegador como si fuera un archivo HTML. Necesitamos ejecutarlo desde un servidor.
Una opción rápida es usar el servidor integrado de PHP. Desde la carpeta del proyecto podemos escribir:
php -S localhost:8000
Después abrimos el navegador y accedemos a:
http://localhost:8000
Para proyectos más completos podemos usar Apache, Nginx, XAMPP, MAMP, Laragon o Docker.
Extensiones recomendadas para PHP en VS Code
Una de las grandes ventajas de VS Code es su sistema de extensiones. A continuación veremos algunas de las más útiles para trabajar con PHP.
📹 Instalación de Extensiones o Plugins
PHP Intelephense
PHP Intelephense es una de las extensiones más importantes para programar en PHP con VS Code.
Añade funciones como:
Función
Utilidad
Autocompletado
Ayuda a escribir funciones, variables, clases y métodos
Detección de errores
Marca posibles errores antes de ejecutar
Ir a definición
Permite saltar a donde está definida una función o clase
Ayuda contextual
Muestra información sobre parámetros y métodos
Mejor soporte para proyectos grandes
Entiende mejor la estructura del código
Esta extensión debería instalarse desde el principio del curso.
Ejemplo:
<?php
function saludar($nombre) { return "Hola, " . $nombre; }
echo saludar("Laura");
?>
Con PHP Intelephense, VS Code nos ayudará a detectar funciones, parámetros y posibles errores de escritura.
PHP Debug
PHP Debug permite conectar VS Code con Xdebug, una herramienta de depuración para PHP.
Depurar significa ejecutar el programa paso a paso para ver qué está ocurriendo realmente. Esto es muy útil cuando un programa no falla por sintaxis, pero no hace lo que esperamos.
Por ejemplo:
<?php
$edad = 17;
if ($edad >= 18) { echo "Puede acceder"; } else { echo "No puede acceder"; }
?>
Con depuración podemos detener el programa antes del if y comprobar el valor real de la variable $edad.
PHP Debug permite:
Función
Utilidad
Puntos de interrupción
Parar el programa en una línea concreta
Ejecución paso a paso
Ver cómo avanza el programa
Inspección de variables
Comprobar valores durante la ejecución
Depuración de formularios
Ver datos enviados por GET o POST
Detección de errores lógicos
Encontrar fallos que no son de sintaxis
No es necesario instalarla el primer día, pero sí es muy recomendable cuando los alumnos ya trabajen con formularios, funciones, sesiones y bases de datos.
PHP DocBlocker
PHP DocBlocker ayuda a crear comentarios de documentación para funciones, clases y métodos.
Por ejemplo, si tenemos esta función:
function calcularTotal($precio, $cantidad) { return $precio * $cantidad; }
Podemos documentarla así:
/** * Calcula el precio total de una compra. * * @param float $precio * @param int $cantidad * @return float */ function calcularTotal($precio, $cantidad) { return $precio * $cantidad; }
Esta extensión resulta útil cuando empezamos a trabajar con funciones y programación orientada a objetos.
Documentar el código es una buena práctica que ayuda a que otros programadores puedan entender mejor nuestro proyecto.
Prettier
Prettier es una extensión para formatear código.
En proyectos PHP no solo escribimos PHP. También solemos trabajar con HTML, CSS y JavaScript. Prettier ayuda a mantener estos archivos ordenados y con un formato consistente.
Por ejemplo, puede ayudarnos con código HTML como este:
Este ejemplo es interesante porque muestra una de las características habituales de PHP: la mezcla de código PHP con HTML.
Desde VS Code escribimos el código, pero para verlo correctamente tendremos que ejecutarlo desde un servidor PHP.
Recomendación para clase
Para un curso de PHP desde cero, mi recomendación sería empezar con pocas extensiones:
Extensión
Prioridad
PHP Intelephense
Obligatoria
Material Icon Theme
Recomendada
Prettier
Recomendada
Auto Rename Tag
Recomendada cuando usemos HTML
GitLens
Cuando empecemos con Git
PHP Debug
Cuando empecemos con depuración
SQLTools
Cuando avancemos con bases de datos
Docker
Cuando trabajemos con contenedores
No es buena idea instalar demasiadas extensiones al principio. Puede parecer que estamos mejorando el entorno, pero en realidad podemos confundir al alumno.
Lo ideal es que el entorno crezca al mismo ritmo que el curso.
Conclusión
Visual Studio Code es una herramienta muy adecuada para aprender PHP porque combina sencillez, potencia y flexibilidad.
Nos permite empezar con scripts básicos y avanzar poco a poco hacia proyectos más completos con HTML, CSS, JavaScript, formularios, sesiones, bases de datos, Git, depuración y Docker.
Pero conviene recordar una idea importante:
VS Code no es el servidor. VS Code es la herramienta donde escribimos el código. PHP necesita un entorno de ejecución para funcionar.
Por eso, en un curso de PHP deberíamos enseñar siempre la relación entre el editor, el servidor, el lenguaje y el navegador.
El objetivo no es solamente aprender a usar VS Code. El objetivo es entender el proceso completo de desarrollo de una aplicación web con PHP:
Editor → Código PHP → Servidor → Navegador → Pruebas → Corrección → Nueva versión
Cuando empezamos a programar en PHP, lo primero que debemos entender no es todavía cómo crear una aplicación completa, ni cómo conectar con una base de datos, ni cómo hacer un formulario avanzado. Antes de todo eso necesitamos aprender a escribir PHP correctamente.
PHP es un lenguaje que normalmente se ejecuta en el servidor. Eso significa que el navegador no interpreta directamente el código PHP. El navegador pide una página al servidor, el servidor ejecuta el PHP y finalmente devuelve al navegador una respuesta, normalmente HTML. Por eso, aunque nosotros escribamos código PHP, el usuario final normalmente solo recibe el resultado.
En este primer tema vamos a trabajar la base de la sintaxis de PHP: cómo se abre y se cierra un bloque PHP, cómo se escriben instrucciones, cómo se declaran variables, qué tipos de datos básicos existen y cómo podemos mostrar información en pantalla usando herramientas como echo, print, var_dump(), print_r(), printf() o var_export().
La idea no es memorizarlo todo de golpe, sino empezar a leer y escribir código PHP con seguridad.
1. Cómo se escribe código PHP
Un archivo PHP normalmente tiene extensión .php. Dentro de ese archivo podemos escribir HTML normal y, cuando queramos que el servidor ejecute código PHP, debemos abrir un bloque PHP.
La forma estándar de abrir PHP es:
<?php // Código PHP aquí ?>
La etiqueta de apertura <?php indica al intérprete que a partir de ese punto empieza código PHP. La etiqueta de cierre ?> indica que termina el bloque PHP. La documentación oficial de PHP explica que estas etiquetas sirven para marcar los límites del código PHP que debe ejecutarse dentro del archivo.
En este ejemplo hay una mezcla de HTML y PHP. El HTML se entrega tal cual al navegador, mientras que la parte PHP se ejecuta en el servidor. El resultado final que verá el navegador será algo parecido a esto:
<h1>Bienvenido a mi página</h1> Este texto lo ha generado PHP
El navegador no ve el código PHP original. Solo ve el resultado.
2. La etiqueta <?php
La etiqueta correcta y recomendable para abrir PHP es:
<?php
Es importante no confundirla con otras formas antiguas o menos recomendables como:
<?
Esa forma corta puede funcionar en algunos servidores, pero depende de la configuración de PHP. Por eso, para aprender bien y evitar problemas, usaremos siempre <?php.
También existe una etiqueta corta especial para imprimir valores:
<?= $variable ?>
Esta etiqueta equivale a escribir:
<?php echo $variable; ?>
Es decir, estas dos líneas hacen lo mismo:
<p><?= $nombre ?></p>
<p><?php echo $nombre; ?></p>
La etiqueta <?= es una forma abreviada de <?php echo, y PHP la reconoce como una etiqueta de salida corta.
Para un alumno que está empezando, mi recomendación es clara: al principio utiliza siempre <?php echo ... ?>. Cuando ya estés cómodo leyendo código PHP, puedes empezar a usar <?= ... ?> en plantillas HTML porque es más cómodo y limpio.
3. ¿Hay que cerrar siempre PHP con ?>?
En archivos donde mezclamos HTML y PHP, sí es normal cerrar el bloque PHP:
<h1> <?php echo "Hola mundo"; ?> </h1>
Pero cuando un archivo contiene solamente PHP, es habitual no cerrar la etiqueta final.
Por ejemplo:
<?php
$nombre = "Laura"; $edad = 25;
echo $nombre;
En este caso no hemos puesto ?> al final. Esto es habitual en archivos PHP puros, especialmente en proyectos profesionales. La razón es sencilla: evita errores provocados por espacios o saltos de línea accidentales después del cierre de PHP.
Para esta primera parte del curso podemos usar ambas formas, pero conviene que el alumno vaya entendiendo esta regla práctica:
Cuando el archivo mezcla HTML y PHP, podemos cerrar PHP. Cuando el archivo solo contiene PHP, normalmente dejamos el archivo sin cierre final.
4. Las instrucciones en PHP
Una instrucción es una orden que le damos al lenguaje. Por ejemplo:
echo "Hola mundo";
Esta instrucción le dice a PHP que muestre el texto "Hola mundo".
En PHP, la mayoría de instrucciones terminan con punto y coma:
$nombre = "Ana"; $edad = 20; echo $nombre;
El punto y coma ; es muy importante. Si se nos olvida, PHP normalmente mostrará un error de sintaxis.
Ejemplo incorrecto:
<?php $nombre = "Ana" echo $nombre;
El problema está en que falta el punto y coma después de "Ana".
La versión correcta sería:
<?php $nombre = "Ana"; echo $nombre;
Al principio puede parecer un detalle pequeño, pero muchos errores de principiantes en PHP vienen precisamente de olvidar un ;, una comilla o una llave.
5. Comentarios en PHP
Los comentarios son textos que escribimos dentro del código, pero que PHP no ejecuta. Sirven para explicar algo, dejar notas o desactivar temporalmente una línea.
PHP permite comentarios de una línea:
<?php
// Esto es un comentario de una línea
$nombre = "Carlos"; // También puedo comentar al final de una línea
echo $nombre;
También permite comentarios de varias líneas:
<?php
/* Este es un comentario de varias líneas. PHP no ejecutará nada de lo que haya aquí dentro. */
echo "Hola";
Los comentarios deben usarse con cabeza. Un buen comentario no explica lo evidente, sino la intención del código.
Este comentario aporta poco:
<?php
// Creamos una variable nombre $nombre = "Ana";
Este comentario sí puede ser útil:
<?php
// Guardamos el nombre que se mostrará en la cabecera de la página $nombre = "Ana";
6. Variables en PHP
Una variable es un espacio donde guardamos un valor. Ese valor puede ser un texto, un número, un verdadero/falso, una lista de datos, etc.
En PHP, todas las variables empiezan con el símbolo $.
$nombre guarda un texto. $edad guarda un número entero. $precio guarda un número decimal. $activo guarda un valor booleano, es decir, verdadero o falso.
La documentación oficial de PHP recoge las variables como una parte fundamental de la referencia del lenguaje.
En PHP no hace falta declarar el tipo de dato al crear una variable. No escribimos esto:
string $nombre = "Ana"; int $edad = 22;
Aunque PHP sí permite usar declaraciones de tipo en funciones y clases, en la creación básica de variables normalmente escribimos directamente:
$nombre = "Ana"; $edad = 22;
PHP detecta el tipo de dato según el valor que le asignamos.
7. Reglas básicas para nombres de variables
Una variable en PHP debe empezar siempre con $.
Después del $, el nombre de la variable debe empezar por una letra o por guion bajo _. No debe empezar por un número.
Para guardar un valor en una variable usamos el operador de asignación =.
<?php
$nombre = "Lucía";
Esta línea no significa “nombre es igual a Lucía” en sentido matemático. Significa: guarda el valor "Lucía" dentro de la variable $nombre.
Podemos cambiar el valor de una variable más adelante:
<?php
$nombre = "Lucía"; echo $nombre;
$nombre = "Mario"; echo $nombre;
Primero $nombre vale "Lucía". Después cambia y pasa a valer "Mario".
También podemos crear una variable a partir de otras variables:
<?php
$precio = 100; $iva = 21;
$precioConIva = $precio + ($precio * $iva / 100);
echo $precioConIva;
En este caso, PHP calcula el precio con IVA y guarda el resultado en $precioConIva.
9. Tipos de datos básicos en PHP
Aunque PHP permite trabajar de forma flexible, es fundamental entender los tipos de datos. Un tipo de dato indica qué clase de valor tenemos entre manos.
No es lo mismo esto:
$edad = 25;
que esto:
$edad = "25";
En el primer caso tenemos un número entero. En el segundo caso tenemos un texto que contiene los caracteres 2 y 5.
PHP tiene varios tipos de datos. En este tema vamos a trabajar los más importantes para empezar: cadenas de texto, enteros, decimales, booleanos, nulos y arrays. PHP incluye en su referencia oficial una sección completa dedicada a los tipos del lenguaje, como booleanos, enteros, números de punto flotante, strings, arrays, objetos, null y otros.
10. Texto o string
Un string es una cadena de texto. Puede contener letras, números, espacios y símbolos.
<?php
$nombre = "Ana"; $ciudad = "Madrid"; $mensaje = "Bienvenido al curso de PHP";
Podemos escribir strings usando comillas dobles:
$nombre = "Ana";
O comillas simples:
$nombre = 'Ana';
Las dos formas sirven, pero tienen una diferencia importante. Con comillas dobles, PHP puede interpretar variables dentro del texto:
<?php
$nombre = "Ana";
echo "Hola $nombre";
Resultado:
Hola Ana
Con comillas simples, PHP no sustituye la variable:
<?php
$nombre = "Ana";
echo 'Hola $nombre';
Resultado:
Hola $nombre
Por eso, si queremos insertar variables directamente dentro de un texto, podemos usar comillas dobles.
También podemos concatenar textos usando el punto .:
<?php
$nombre = "Ana";
echo "Hola " . $nombre;
Resultado:
Hola Ana
La concatenación es muy importante en PHP. El operador . une textos.
Los booleanos serán fundamentales cuando trabajemos con condiciones.
Por ejemplo:
<?php
$usuarioActivo = true;
if ($usuarioActivo) { echo "El usuario puede acceder."; } else { echo "El usuario no puede acceder."; }
Aunque todavía no hayamos estudiado en profundidad los if, este ejemplo nos permite ver para qué sirve un booleano. La variable $usuarioActivo representa una decisión: sí o no, verdadero o falso.
14. Valor nulo o null
null representa la ausencia de valor.
<?php
$telefono = null;
No significa que el teléfono sea un texto vacío. No significa que sea cero. Significa que no hay valor.
Esto es diferente:
$telefono = "";
Aquí sí hay un valor: una cadena vacía.
Y esto también es diferente:
$telefono = 0;
Aquí hay un valor numérico: cero.
null se utiliza mucho cuando un dato todavía no existe, cuando no se ha rellenado o cuando queremos indicar expresamente que una variable no tiene contenido.
Ejemplo:
<?php
$segundoApellido = null;
var_dump($segundoApellido);
Resultado aproximado:
NULL
15. Arrays
Un array permite guardar varios valores dentro de una misma variable. Según la documentación oficial, en PHP un array es realmente un mapa ordenado, es decir, una estructura que asocia claves con valores. Esto permite usarlo como lista, diccionario, colección y otras estructuras.
Un array sencillo sería:
<?php
$frutas = ["manzana", "pera", "plátano"];
Podemos acceder a cada elemento usando su posición. En PHP, como en muchos lenguajes, las posiciones empiezan en cero.
Los arrays son muy importantes en PHP. Los usaremos más adelante para manejar datos de formularios, resultados de bases de datos, configuraciones, sesiones y muchas otras partes de una aplicación web.
16. Cambios de tipo en PHP
PHP es un lenguaje flexible. Una misma variable puede contener primero un texto y después un número.
<?php
$dato = "Hola"; $dato = 25; $dato = true;
Esto funciona, pero no siempre es buena idea abusar de ello.
Cuando estamos aprendiendo, conviene que una variable tenga un sentido claro. Si una variable se llama $edad, debería guardar una edad. Si se llama $nombre, debería guardar un nombre. Si se llama $precio, debería guardar un precio.
La flexibilidad de PHP es cómoda, pero también puede esconder errores. Por eso es importante escribir nombres de variables claros y comprobar los valores mientras programamos.
17. Mostrar información con echo
echo es una de las formas más habituales de mostrar información en PHP.
<?php
echo "Hola mundo";
También podemos mostrar el contenido de una variable:
Este segundo estilo suele ser más cómodo cuando estamos creando vistas o plantillas HTML.
18. Mostrar información con print
print es parecido a echo.
<?php
print "Hola mundo";
También puede mostrar variables:
<?php
$nombre = "Carlos";
print $nombre;
En el uso diario, echo es más habitual. Para un alumno que empieza, podemos decir que ambos sirven para mostrar información, pero usaremos principalmente echo.
var_dump() es una herramienta fundamental para aprender y depurar código PHP.
Mientras echo muestra un valor de forma sencilla, var_dump() muestra información más detallada: el tipo de dato y el valor. La documentación oficial indica que var_dump() muestra información estructurada de una o más expresiones, incluyendo su tipo y su valor.
Esto es muy útil para entender qué está pasando realmente.
Por ejemplo, observa este caso:
<?php
$edad = "22";
var_dump($edad);
Resultado:
string(2) "22"
Aunque visualmente parezca un número, PHP nos está diciendo que es un texto de dos caracteres.
Ahora mira este otro:
<?php
$edad = 22;
var_dump($edad);
Resultado:
int(22)
Ahora sí es un número entero.
Esta diferencia será muy importante cuando trabajemos con formularios, porque muchos datos que llegan desde un formulario llegan inicialmente como texto.
20. Usar <pre> con var_dump()
Cuando usamos var_dump() en el navegador, el resultado puede verse poco ordenado, especialmente con arrays.
Este recurso lo usaremos muchísimo durante el aprendizaje.
21. print_r(): ver arrays de forma más simple
print_r() también sirve para inspeccionar variables, especialmente arrays. No muestra tanta información como var_dump(), pero a veces es más fácil de leer.
La diferencia principal es que print_r() muestra la estructura de forma más limpia, pero no indica con tanto detalle los tipos de datos.
Comparemos:
<?php
$edad = "22";
echo "<pre>"; print_r($edad); echo "</pre>";
echo "<pre>"; var_dump($edad); echo "</pre>";
print_r() mostraría algo parecido a:
22
var_dump() mostraría:
string(2) "22"
Para aprender, var_dump() suele ser mejor porque nos dice el tipo. Para revisar arrays grandes de forma rápida, print_r() puede resultar más cómodo.
22. printf(): salida con formato
printf() permite mostrar texto usando marcadores de posición. Es muy útil cuando queremos construir una frase con valores variables de forma más controlada.
Ejemplo básico:
<?php
$nombre = "Ana"; $edad = 22;
printf("Me llamo %s y tengo %d años.", $nombre, $edad);
Resultado:
Me llamo Ana y tengo 22 años.
Aquí aparecen dos marcadores:
%s se usa para cadenas de texto. %d se usa para números enteros.
Para imprimir el símbolo % usando printf(), escribimos %%.
23. sprintf(): guardar el texto formateado en una variable
sprintf() se parece mucho a printf(), pero no muestra directamente el resultado. En lugar de eso, devuelve el texto formateado para que podamos guardarlo en una variable.
24. var_export(): mostrar una representación válida en PHP
var_export() es otra herramienta de inspección. Se parece a var_dump(), pero tiene una diferencia interesante: genera una representación que se parece mucho a código PHP válido. La documentación oficial explica que var_export() obtiene información estructurada de una variable y que su representación es código PHP válido.
No es una función que necesitemos usar todo el tiempo al empezar, pero conviene conocerla. Puede ser útil cuando queremos ver una estructura de datos en un formato que luego podríamos copiar y reutilizar como código PHP.
25. Diferencia práctica entre echo, var_dump(), print_r() y printf()
La mejor forma de entender estas herramientas es verlas sobre el mismo dato.
echo "<h2>Con printf()</h2>"; printf( "El producto %s cuesta %.2f euros y tiene %d unidades en stock.", $producto["nombre"], $producto["precio"], $producto["stock"] );
Cada herramienta tiene un propósito distinto.
echo sirve para mostrar contenido sencillo.
print_r() sirve para ver estructuras como arrays de forma clara.
var_dump() sirve para ver estructura, valores y tipos de datos.
printf() sirve para construir una salida con formato.
var_export() sirve para ver una representación reutilizable como código PHP.
No hay que elegir una para todo. Lo importante es saber cuándo interesa cada una.
26. Primer ejemplo completo: datos de un alumno
Vamos a construir un ejemplo sencillo que combine variables, tipos de datos y salida por pantalla.
Este tipo de ejemplo es perfecto para clase, porque permite ver dos cosas a la vez: lo que se muestra al usuario y lo que PHP está manejando internamente.
27. Segundo ejemplo completo: producto de una tienda
Ahora vamos a usar un ejemplo más cercano a una aplicación web real: un producto de una tienda.
Aunque todavía no hayamos estudiado condiciones en profundidad, el ejemplo se entiende bastante bien. Tenemos un producto, un precio, un descuento y un cálculo final.
Este ejemplo también muestra por qué los tipos de datos importan:
$nombreProducto es texto. $precio es decimal. $unidadesDisponibles es entero. $tieneDescuento es booleano. $precioFinal se calcula a partir de otros valores.
28. Errores frecuentes al empezar con PHP
Uno de los errores más comunes es olvidar el punto y coma:
<?php
$nombre = "Ana" echo $nombre;
La forma correcta es:
<?php
$nombre = "Ana"; echo $nombre;
Otro error muy común es olvidar el símbolo $ delante de una variable:
<?php
nombre = "Ana";
La forma correcta es:
<?php
$nombre = "Ana";
También es frecuente mezclar mal las comillas:
<?php
echo "Hola mundo';
La forma correcta sería:
<?php
echo "Hola mundo";
O también:
<?php
echo 'Hola mundo';
Otro error habitual aparece al concatenar:
<?php
$nombre = "Ana";
echo "Hola " $nombre;
La forma correcta es usar el punto:
<?php
$nombre = "Ana";
echo "Hola " . $nombre;
También podemos usar comillas dobles con la variable dentro:
<?php
$nombre = "Ana";
echo "Hola $nombre";
Pero al principio recomiendo practicar bastante la concatenación con . porque ayuda a entender mejor cómo se construyen las cadenas.
29. Buenas prácticas desde el primer día
Aunque estemos empezando, conviene adquirir buenas costumbres desde el principio.
Una buena práctica es usar nombres de variables descriptivos:
También es buena idea usar var_dump() durante el aprendizaje. No debemos verlo como algo “de novatos”, sino como una herramienta de trabajo. Programar no consiste en adivinar qué está pasando. Programar consiste en comprobarlo.
30. Ejercicio guiado para el alumno
Crea un archivo llamado:
tema1_sintaxis.php
Dentro del archivo, crea una pequeña ficha personal usando variables.
Debe tener los siguientes datos:
Nombre. Edad. Ciudad. Curso. Nota media. Si está matriculado o no. Un dato opcional con valor null, por ejemplo, segundo teléfono.
Después, muestra la información en HTML usando echo y printf().
Finalmente, muestra una zona de depuración usando var_dump().
El objetivo no es solo que funcione. El objetivo es que el código se entienda.
32. Resumen final
En este tema hemos visto la base de la sintaxis de PHP. Ya sabemos que el código PHP se escribe dentro de bloques que empiezan normalmente con <?php. También hemos visto que las instrucciones suelen terminar con punto y coma y que los comentarios nos permiten documentar el código sin que PHP los ejecute.
Hemos aprendido que las variables en PHP empiezan con $ y que pueden guardar diferentes tipos de datos: textos, enteros, decimales, booleanos, valores nulos y arrays. También hemos visto que PHP es flexible con los tipos, pero que precisamente por eso debemos ser ordenados y claros al escribir nuestras variables.
Por último, hemos trabajado varias herramientas de salida. echo nos permite mostrar contenido sencillo. print es parecido, aunque lo usaremos menos. var_dump() nos muestra el tipo y el valor de una variable, lo que lo convierte en una herramienta excelente para aprender y depurar. print_r() resulta cómodo para ver arrays. printf() nos permite mostrar textos con formato, especialmente útil para números y precios. Y var_export() nos ofrece una representación más cercana a código PHP reutilizable.
A partir de aquí ya podemos empezar a escribir pequeños scripts PHP con sentido. Todavía son programas sencillos, pero esta base es imprescindible. Si el alumno domina bien variables, tipos y salida por pantalla, tendrá mucho más fácil entender condiciones, bucles, funciones, formularios y bases de datos en los siguientes temas.
Hasta ahora hemos visto cómo escribir nuestros primeros scripts en PHP, cómo crear variables, cómo mostrar información en pantalla y cómo trabajar con distintos tipos de datos. Todo eso nos permite guardar y enseñar información, pero todavía nos falta algo fundamental: hacer que el programa tome decisiones.
Un programa real no ejecuta siempre las mismas instrucciones de forma lineal. A veces debe comprobar una condición y actuar de una manera u otra. Por ejemplo:
Un usuario puede ser mayor o menor de edad.
Una contraseña puede ser correcta o incorrecta.
Un producto puede tener stock o estar agotado.
Una nota puede estar aprobada o suspensa.
Un usuario puede ser administrador o cliente normal.
Para resolver este tipo de situaciones utilizamos condicionales.
En PHP, igual que en muchos otros lenguajes de programación, las estructuras condicionales nos permiten ejecutar un bloque de código solamente si se cumple una condición.
1. ¿Qué es una condición?
Una condición es una expresión que PHP puede evaluar como verdadera o falsa.
Por ejemplo:
$edad = 20;
$edad >= 18
La expresión anterior comprueba si la variable $edad es mayor o igual que 18.
Como $edad vale 20, la condición se cumple. Es decir, PHP la considera verdadera.
Si cambiamos el valor:
$edad = 15;
$edad >= 18
Ahora la condición no se cumple, porque 15 no es mayor o igual que 18.
Cuando trabajamos con condicionales, PHP evalúa expresiones que normalmente devuelven un valor booleano:
true false
Aunque en PHP también hay valores que pueden comportarse como verdaderos o falsos, como veremos más adelante.
2. El condicional if
La estructura condicional más básica es if.
Su traducción sería:
Si se cumple esta condición, ejecuta este bloque de código.
La estructura general es:
if (condicion) { // Código que se ejecuta si la condición es verdadera }
Ejemplo básico:
<?php
$edad = 20;
if ($edad >= 18) { echo "Eres mayor de edad."; }
?>
En este caso, como $edad vale 20, la condición $edad >= 18 se cumple y se mostrará el mensaje:
Eres mayor de edad.
Si cambiamos la edad:
<?php
$edad = 15;
if ($edad >= 18) { echo "Eres mayor de edad."; }
?>
No se mostrará nada, porque la condición no se cumple.
Esto es importante: si la condición de un if no se cumple, PHP ignora el bloque de código que está dentro de las llaves.
3. Ejemplo práctico: comprobar una nota
Vamos a imaginar que estamos creando una pequeña aplicación para mostrar si un alumno ha aprobado.
<?php
$nota = 7;
if ($nota >= 5) { echo "Has aprobado."; }
?>
Como la nota es 7, se muestra:
Has aprobado.
Pero si la nota fuese un 3, no aparecería ningún mensaje. Eso no es muy útil para el usuario, porque si ha suspendido también deberíamos informarle.
Para eso usamos else.
4. El condicional if...else
La estructura if...else permite ejecutar un bloque de código cuando la condición se cumple y otro bloque diferente cuando no se cumple.
Su traducción sería:
Si se cumple esta condición, haz esto. Si no se cumple, haz esto otro.
Estructura general:
if (condicion) { // Código si la condición es verdadera } else { // Código si la condición es falsa }
PHP considera que 5 y "5" son iguales en valor, aunque uno sea un número entero y el otro sea una cadena de texto.
Ahora usamos ===:
<?php
$numero = 5; $texto = "5";
if ($numero === $texto) { echo "Son iguales usando ===."; } else { echo "No son exactamente iguales."; }
?>
Resultado:
No son exactamente iguales.
¿Por qué? Porque $numero es un entero y $texto es una cadena.
En programación real, especialmente cuando trabajemos con formularios, bases de datos y sesiones, conviene acostumbrarse a usar === cuando queramos comprobar igualdad estricta.
8. Ejemplo práctico: comprobar usuario y contraseña
Para que el acceso sea permitido, ambas deben cumplirse.
Para unir condiciones usamos operadores lógicos.
9. Operadores lógicos
Los operadores lógicos permiten combinar varias condiciones.
Los principales son:
Operador
Nombre
Significado
&&
AND
Se cumplen todas las condiciones
`
`
!
NOT
Niega una condición
Aunque PHP también permite escribir and y or, en este nivel es recomendable usar && y ||, porque son más habituales y evitan algunos problemas de prioridad.
10. Uso de &&: todas las condiciones deben cumplirse
El operador && significa “y”.
Se utiliza cuando necesitamos que se cumplan varias condiciones a la vez.
Ejemplo:
<?php
$edad = 22; $tieneEntrada = true;
if ($edad >= 18 && $tieneEntrada === true) { echo "Puedes entrar al evento."; } else { echo "No puedes entrar al evento."; }
?>
Para poder entrar al evento deben cumplirse dos cosas:
La persona debe tener al menos 18 años. La persona debe tener entrada.
Si una de las dos falla, el resultado será negativo.
Podemos escribirlo también de forma un poco más natural:
<?php
$edad = 22; $tieneEntrada = true;
if ($edad >= 18 && $tieneEntrada) { echo "Puedes entrar al evento."; } else { echo "No puedes entrar al evento."; }
?>
Cuando una variable ya contiene true o false, no siempre es necesario compararla con true.
11. Uso de ||: basta con que se cumpla una condición
El operador || significa “o”.
Se utiliza cuando basta con que se cumpla una de varias condiciones.
Ejemplo:
<?php
$rol = "editor";
if ($rol === "admin" || $rol === "editor") { echo "Puedes acceder al panel de gestión."; } else { echo "No tienes permisos para acceder."; }
?>
En este caso, el usuario puede acceder si su rol es "admin" o si su rol es "editor".
Como $rol vale "editor", la condición se cumple.
Este tipo de comprobación se usa mucho en aplicaciones web con distintos tipos de usuario.
12. Uso de !: negar una condición
El operador ! sirve para negar una condición.
Es decir, convierte true en false y false en true.
Ejemplo:
<?php
$sesionIniciada = false;
if (!$sesionIniciada) { echo "Debes iniciar sesión para continuar."; }
?>
La variable $sesionIniciada vale false.
Al escribir:
!$sesionIniciada
Estamos diciendo:
Si NO hay sesión iniciada…
Por eso se muestra el mensaje.
Otro ejemplo:
<?php
$productoDisponible = false;
if (!$productoDisponible) { echo "El producto no está disponible."; } else { echo "Puedes comprar el producto."; }
?>
13. elseif: comprobar varias posibilidades
A veces no tenemos solo dos caminos posibles.
Por ejemplo, una nota no es simplemente aprobado o suspenso. También podemos querer distinguir entre suspenso, aprobado, notable y sobresaliente.
Para eso usamos elseif.
La estructura general es:
if (condicion1) { // Código si se cumple la primera condición } elseif (condicion2) { // Código si no se cumple la primera, pero sí la segunda } elseif (condicion3) { // Código si se cumple la tercera } else { // Código si no se cumple ninguna de las anteriores }
Primero comprueba si $nota < 5. Como 8 < 5 es falso, pasa al siguiente. Después comprueba si $nota < 7. Como 8 < 7 es falso, pasa al siguiente. Después comprueba si $nota < 9. Como 8 < 9 es verdadero, ejecuta ese bloque y ya no sigue comprobando más.
if ($edad >= 18) { if ($tieneEntrada) { if (!$estaVetado) { echo "Puedes entrar."; } else { echo "No puedes entrar porque estás vetado."; } } else { echo "No puedes entrar porque no tienes entrada."; } } else { echo "No puedes entrar porque eres menor de edad."; }
?>
Funciona, pero empieza a ser incómodo.
Podemos escribirlo de una forma más clara usando varias condiciones:
if ($edad < 18) { echo "No puedes entrar porque eres menor de edad."; } elseif (!$tieneEntrada) { echo "No puedes entrar porque no tienes entrada."; } elseif ($estaVetado) { echo "No puedes entrar porque estás vetado."; } else { echo "Puedes entrar."; }
?>
Este segundo código suele ser más fácil de leer porque va descartando casos.
Primero mira si la edad no es válida. Después mira si no tiene entrada. Después mira si está vetado. Y si no ocurre nada de eso, permite entrar.
Este estilo será muy útil cuando empecemos a validar formularios.
18. Condicionales con cadenas de texto
Los condicionales no solo sirven para números. También podemos comparar cadenas de texto.
Ejemplo:
<?php
$dia = "lunes";
if ($dia === "lunes") { echo "Hoy empieza la semana."; } else { echo "Hoy no es lunes."; }
?>
Otro ejemplo:
<?php
$estadoPedido = "pendiente";
if ($estadoPedido === "pendiente") { echo "Tu pedido está pendiente de preparación."; } elseif ($estadoPedido === "enviado") { echo "Tu pedido ya ha sido enviado."; } elseif ($estadoPedido === "entregado") { echo "Tu pedido ha sido entregado."; } else { echo "Estado del pedido desconocido."; }
?>
Este ejemplo se parece más a una situación real. Muchas aplicaciones trabajan con estados: usuarios activos o inactivos, pedidos pendientes, reservas aceptadas, productos agotados, pagos confirmados, etc.
19. Ejemplo práctico: estado de una reserva
Imaginemos que estamos desarrollando una aplicación de reservas.
Una reserva puede estar en distintos estados:
pendiente, aceptada, cancelada o finalizada.
<?php
$estadoReserva = "pendiente";
if ($estadoReserva === "pendiente") { echo "La reserva está pendiente de confirmación."; } elseif ($estadoReserva === "aceptada") { echo "La reserva ha sido aceptada."; } elseif ($estadoReserva === "cancelada") { echo "La reserva ha sido cancelada."; } elseif ($estadoReserva === "finalizada") { echo "La reserva ya ha finalizado."; } else { echo "El estado de la reserva no es válido."; }
?>
Este tipo de estructura se usará mucho cuando trabajemos con bases de datos. Por ejemplo, podemos guardar en una tabla el estado de una reserva y después mostrar un mensaje diferente según ese estado.
20. La estructura switch
Cuando tenemos que comparar una misma variable con muchos valores posibles, podemos usar switch.
Por ejemplo, este código con if funciona perfectamente:
<?php
$dia = "martes";
if ($dia === "lunes") { echo "Inicio de semana."; } elseif ($dia === "martes") { echo "Segundo día de la semana."; } elseif ($dia === "miércoles") { echo "Mitad de semana."; } elseif ($dia === "jueves") { echo "Casi viernes."; } elseif ($dia === "viernes") { echo "Último día laboral."; } else { echo "Fin de semana o día no reconocido."; }
?>
Pero también podemos escribirlo con switch:
<?php
$dia = "martes";
switch ($dia) { case "lunes": echo "Inicio de semana."; break;
case "martes": echo "Segundo día de la semana."; break;
case "miércoles": echo "Mitad de semana."; break;
case "jueves": echo "Casi viernes."; break;
case "viernes": echo "Último día laboral."; break;
default: echo "Fin de semana o día no reconocido."; break; }
?>
El switch compara el valor de $dia con cada uno de los case.
Cuando encuentra una coincidencia, ejecuta el código correspondiente.
El default se ejecuta si no coincide con ningún case.
21. La importancia de break en switch
En un switch, normalmente escribimos break al final de cada case.
El break sirve para salir del switch.
Si olvidamos el break, PHP puede seguir ejecutando los siguientes casos aunque no correspondan.
Ejemplo problemático:
<?php
$rol = "editor";
switch ($rol) { case "admin": echo "Acceso total.";
case "editor": echo "Acceso a edición.";
case "cliente": echo "Acceso a compras.";
default: echo "Rol desconocido."; }
?>
Si $rol vale "editor", PHP entra en el caso "editor", pero como no hay break, seguirá ejecutando también los bloques siguientes.
Por eso deberíamos escribirlo así:
<?php
$rol = "editor";
switch ($rol) { case "admin": echo "Acceso total."; break;
case "editor": echo "Acceso a edición."; break;
case "cliente": echo "Acceso a compras."; break;
default: echo "Rol desconocido."; break; }
?>
22. Ejemplo práctico con switch: menú de opciones
Imaginemos que tenemos una variable que representa la opción seleccionada por un usuario en un menú.
<?php
$opcion = 2;
switch ($opcion) { case 1: echo "Has seleccionado ver productos."; break;
case 2: echo "Has seleccionado ver el carrito."; break;
case 3: echo "Has seleccionado finalizar compra."; break;
case 4: echo "Has seleccionado salir."; break;
default: echo "Opción no válida."; break; }
?>
Este tipo de estructura es útil cuando estamos gestionando opciones cerradas y conocidas.
23. match: una alternativa moderna a switch
En versiones modernas de PHP existe también la expresión match.
Se parece a switch, pero tiene algunas diferencias importantes:
match devuelve un valor.
No necesita break.
Compara de forma estricta.
Suele ser más compacto.
Ejemplo:
<?php
$estadoPedido = "enviado";
$mensaje = match ($estadoPedido) { "pendiente" => "Tu pedido está pendiente.", "enviado" => "Tu pedido ha sido enviado.", "entregado" => "Tu pedido ha sido entregado.", "cancelado" => "Tu pedido ha sido cancelado.", default => "Estado desconocido.", };
echo $mensaje;
?>
Resultado:
Tu pedido ha sido enviado.
match es muy útil cuando queremos asignar un valor dependiendo de otro.
if ($nombre === "") { echo "El nombre es obligatorio."; } elseif ($edad === "") { echo "La edad es obligatoria."; } elseif ($email === "") { echo "El email es obligatorio."; } elseif ($edad < 18) { echo "Debes ser mayor de edad para registrarte."; } else { echo "Registro correcto."; }
?>
Este ejemplo ya se parece mucho más a una validación real.
Primero comprobamos que los campos obligatorios no estén vacíos. Después comprobamos una regla concreta: que la edad sea mayor o igual que 18. Finalmente, si todo está bien, mostramos el mensaje de registro correcto.
28. Mejorando la validación de edad
Hay un detalle importante. Los datos que llegan desde un formulario suelen llegar como texto, aunque el input sea de tipo number.
Por eso conviene validar bien.
<?php
$edad = $_POST["edad"] ?? "";
if ($edad === "") { echo "La edad es obligatoria."; } elseif (!is_numeric($edad)) { echo "La edad debe ser un número."; } elseif ($edad < 0 || $edad > 120) { echo "La edad no parece válida."; } elseif ($edad < 18) { echo "Debes ser mayor de edad."; } else { echo "Edad correcta."; }
?>
Aquí aparece una función nueva:
is_numeric($edad)
Esta función comprueba si un valor es numérico.
El operador ! delante significa “no”.
Por tanto:
!is_numeric($edad)
significa:
Si la edad no es numérica…
Este tipo de validación es esencial. Nunca debemos confiar ciegamente en los datos que llegan desde un formulario.
29. Condicionales y arrays
Aunque los arrays se estudiarán con más detalle más adelante, podemos ver ya un ejemplo sencillo.
Imaginemos que tenemos un array con productos:
<?php
$productos = ["teclado", "ratón", "monitor"];
$productoBuscado = "ratón";
if (in_array($productoBuscado, $productos)) { echo "El producto está disponible."; } else { echo "El producto no está disponible."; }
?>
La función in_array() comprueba si un valor existe dentro de un array.
En este caso, "ratón" sí está dentro del array, por lo que se muestra:
La función date("H") devuelve la hora actual en formato de 24 horas.
Si la hora es menor que 12, mostramos "Buenos días". Si no, pero es menor que 20, mostramos "Buenas tardes". En cualquier otro caso, mostramos "Buenas noches".
Este tipo de condicional puede usarse en una web para personalizar mensajes según la hora.
31. Valores que PHP interpreta como falso
En PHP no solamente false se considera falso.
También hay otros valores que, en una condición, PHP puede interpretar como falsos.
Algunos de los más importantes son:
Valor
PHP lo interpreta como
false
falso
0
falso
"0"
falso
""
falso
null
falso
[]
falso
Ejemplo:
<?php
$nombre = "";
if ($nombre) { echo "El nombre tiene contenido."; } else { echo "El nombre está vacío."; }
?>
Como $nombre contiene una cadena vacía, PHP la interpreta como falso.
Resultado:
El nombre está vacío.
Sin embargo, para alumnos que están empezando, muchas veces es más claro escribir condiciones explícitas:
<?php
$nombre = "";
if ($nombre !== "") { echo "El nombre tiene contenido."; } else { echo "El nombre está vacío."; }
?>
Este segundo ejemplo deja más claro qué estamos comprobando.
32. Ejemplo práctico completo: acceso a una zona privada
Vamos a unir varias ideas en un ejemplo más completo.
Queremos comprobar:
El usuario debe haber iniciado sesión. La cuenta debe estar activa. El rol debe ser admin o editor.
if (!$sesionIniciada) { echo "Debes iniciar sesión."; } elseif (!$cuentaActiva) { echo "Tu cuenta no está activa."; } elseif ($rol === "admin" || $rol === "editor") { echo "Puedes acceder a la zona privada."; } else { echo "No tienes permisos suficientes."; }
?>
Este código está escrito de forma ordenada.
Primero comprobamos los errores principales:
Si no hay sesión, no dejamos continuar. Si la cuenta no está activa, tampoco. Si todo lo anterior está bien, miramos los permisos. Finalmente, si no tiene el rol adecuado, denegamos el acceso.
Este patrón es muy habitual en programación web.
33. Ejemplo práctico completo: carrito de compra
Vamos a imaginar que tenemos una tienda online sencilla.
Queremos comprobar si un producto se puede comprar.
if ($stock <= 0) { echo "El producto $producto está agotado."; } elseif (!$usuarioRegistrado) { echo "Debes iniciar sesión para comprar."; } else { echo "Puedes comprar $producto por $precio euros."; }
?>
Resultado:
El producto Monitor 24 pulgadas está agotado.
Fíjate en que, si el producto está agotado, ya no tiene sentido comprobar si el usuario está registrado. PHP entra en el primer bloque y termina la estructura condicional.
34. Ejemplo práctico completo: cálculo de descuento
Vamos a crear un pequeño sistema de descuentos.
Si el cliente compra más de 100 euros, tiene un 10% de descuento. Si compra más de 200 euros, tiene un 20% de descuento. Si compra 100 euros o menos, no tiene descuento.
Total inicial: 250 euros Descuento aplicado: 20% Importe descontado: 50 euros Total final: 200 euros
El orden aquí también importa. Primero comprobamos la condición más alta:
$totalCompra > 200
Si empezáramos por $totalCompra > 100, una compra de 250 euros entraría ahí y solo recibiría un 10% de descuento.
35. Ejemplo práctico completo: reserva de habitación
Imaginemos una aplicación muy sencilla para reservar una habitación.
Queremos comprobar:
Que hay habitaciones disponibles. Que el cliente ha indicado número de noches. Que el número de noches es válido. Que el cliente acepta las condiciones.
if ($habitacionesDisponibles <= 0) { echo "No hay habitaciones disponibles."; } elseif ($noches <= 0) { echo "Debes indicar un número de noches válido."; } elseif (!$aceptaCondiciones) { echo "Debes aceptar las condiciones de la reserva."; } else { $precioTotal = $noches * $precioPorNoche;
Este ejemplo es interesante porque dentro del else no solo mostramos un mensaje, sino que hacemos un cálculo.
Esto es habitual: primero validamos, después procesamos.
36. Ejemplo práctico completo: panel según rol de usuario
Una web puede mostrar opciones diferentes dependiendo del tipo de usuario.
<?php
$rol = "admin";
if ($rol === "admin") { echo "<h2>Panel de administración</h2>"; echo "<p>Puedes gestionar usuarios, productos y reservas.</p>"; } elseif ($rol === "editor") { echo "<h2>Panel de edición</h2>"; echo "<p>Puedes crear y modificar contenidos.</p>"; } elseif ($rol === "cliente") { echo "<h2>Zona de cliente</h2>"; echo "<p>Puedes consultar tus pedidos y modificar tus datos.</p>"; } else { echo "<h2>Acceso limitado</h2>"; echo "<p>No se reconoce tu rol de usuario.</p>"; }
?>
Aquí PHP no solo toma una decisión lógica, también genera HTML diferente según el caso.
Este es uno de los motivos por los que PHP se usa tanto en desarrollo web: puede mezclar lógica del servidor con generación dinámica de contenido HTML.
37. Alternar PHP y HTML en condicionales
También podemos escribir condicionales mezclando PHP y HTML de otra forma.
<?php if ($usuarioRegistrado): ?> <h1>Bienvenido a tu cuenta</h1> <p>Desde aquí puedes gestionar tus datos.</p> <?php else: ?> <h1>Acceso no permitido</h1> <p>Debes iniciar sesión para ver esta página.</p> <?php endif; ?>
</body> </html>
Esta sintaxis alternativa es bastante usada en plantillas PHP, porque puede resultar más legible cuando hay mucho HTML.
En lugar de abrir y cerrar llaves {}, usamos:
<?php if (condicion): ?> HTML <?php else: ?> HTML <?php endif; ?>
No es obligatorio usarla, pero conviene conocerla porque aparece en muchos proyectos PHP y en plantillas de WordPress.
38. Otro ejemplo con HTML: mostrar un aviso de stock
Este ejemplo representa una situación muy real. En una tienda online no queremos mostrar el mismo botón si el producto está disponible que si está agotado.
39. Condicionales y seguridad básica
Los condicionales también ayudan a proteger partes de una aplicación.
Por ejemplo, podemos impedir que un usuario no identificado vea una página privada.
<?php
$logueado = false;
if (!$logueado) { echo "No tienes permiso para acceder a esta página."; exit; }
echo "Contenido privado de la aplicación.";
?>
La función exit detiene la ejecución del script.
Esto significa que si el usuario no está logueado, PHP muestra el mensaje y deja de ejecutar el resto del archivo.
Más adelante, cuando trabajemos con sesiones, este tipo de código será muy habitual:
<?php
session_start();
if (!isset($_SESSION["usuario"])) { echo "Debes iniciar sesión."; exit; }
echo "Bienvenido a la zona privada.";
?>
En este ejemplo todavía aparecen elementos que se estudiarán más adelante, como session_start() y $_SESSION, pero la idea principal ya se entiende: usamos un condicional para proteger una parte del programa.
40. isset() y empty()
PHP tiene funciones muy utilizadas para comprobar variables.
La función isset() comprueba si una variable existe y no es null.
Ejemplo:
<?php
if (isset($_POST["nombre"])) { echo "El campo nombre ha sido enviado."; } else { echo "El campo nombre no existe."; }
?>
La función empty() comprueba si una variable está vacía.
Ejemplo:
<?php
$nombre = "";
if (empty($nombre)) { echo "El nombre está vacío."; } else { echo "El nombre tiene contenido."; }
?>
Hay que tener cuidado con empty(), porque considera vacíos varios valores, como "", 0, "0", null, false o [].
Ejemplo:
<?php
$stock = 0;
if (empty($stock)) { echo "No hay stock o el valor está vacío."; }
?>
Aunque $stock existe y vale 0, empty() lo considera vacío.
Por eso, en algunos casos es mejor hacer comprobaciones explícitas:
<?php
$stock = 0;
if ($stock === 0) { echo "El producto está agotado."; }
?>
La idea importante es esta: no basta con saber que una función existe; hay que saber exactamente qué está comprobando.
41. Ejemplo práctico: validar un formulario de login
if ($nombre === "") { echo "El nombre es obligatorio."; } elseif ($email === "") { echo "El email es obligatorio."; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "El email no tiene un formato válido."; } elseif ($password === "") { echo "La contraseña es obligatoria."; } elseif (strlen($password) < 6) { echo "La contraseña debe tener al menos 6 caracteres."; } elseif ($password !== $repetirPassword) { echo "Las contraseñas no coinciden."; } elseif (!$aceptaCondiciones) { echo "Debes aceptar las condiciones."; } else { echo "Registro completado correctamente."; }
?>
Aquí aparecen dos funciones útiles:
filter_var($email, FILTER_VALIDATE_EMAIL)
Sirve para comprobar si un email tiene un formato válido.
strlen($password)
Devuelve la longitud de una cadena de texto.
Este ejemplo es muy representativo de cómo se trabaja en aplicaciones web: recogemos datos, comprobamos condiciones y, si todo es correcto, continuamos.
43. Ejemplo práctico: mostrar errores acumulados
En el ejemplo anterior solo mostramos el primer error encontrado. Eso está bien para empezar, pero en una aplicación real puede interesarnos mostrar todos los errores a la vez.
if ($nombre === "") { $errores[] = "El nombre es obligatorio."; }
if ($email === "") { $errores[] = "El email es obligatorio."; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errores[] = "El email no tiene un formato válido."; }
if ($password === "") { $errores[] = "La contraseña es obligatoria."; } elseif (strlen($password) < 6) { $errores[] = "La contraseña debe tener al menos 6 caracteres."; }
if (count($errores) > 0) { echo "<h2>Se han encontrado errores:</h2>";
Cuando trabajamos con rangos, hay que prestar mucha atención a los límites.
Por ejemplo:
$temperatura <= 15
incluye el valor 15.
Mientras que:
$temperatura < 15
no lo incluiría.
48. Ejemplo práctico: recomendador sencillo
Podemos usar condicionales para crear un recomendador muy simple.
<?php
$presupuesto = 800; $uso = "programacion";
if ($presupuesto < 500) { echo "Te recomendamos un equipo básico para tareas de oficina y navegación."; } elseif ($presupuesto <= 1000 && $uso === "programacion") { echo "Te recomendamos un portátil con buen procesador y al menos 16 GB de RAM."; } elseif ($presupuesto <= 1000 && $uso === "videojuegos") { echo "Te recomendamos buscar un equipo con tarjeta gráfica dedicada."; } elseif ($presupuesto > 1000 && $uso === "programacion") { echo "Puedes optar por un equipo potente para desarrollo, máquinas virtuales y Docker."; } else { echo "Necesitamos más información para hacer una recomendación."; }
?>
Este ejemplo combina comparación numérica y comparación de cadenas.
49. Errores comunes al trabajar con condicionales
Uno de los errores más habituales es usar = en vez de == o ===.
Esto está mal:
<?php
$usuario = "cliente";
if ($usuario = "admin") { echo "Eres administrador."; }
?>
El operador = no compara. El operador = asigna.
Es decir, en vez de comprobar si $usuario es "admin", estamos cambiando el valor de $usuario.
La comparación correcta sería:
<?php
$usuario = "cliente";
if ($usuario === "admin") { echo "Eres administrador."; } else { echo "No eres administrador."; }
?>
Otro error habitual es olvidar las llaves:
<?php
$edad = 20;
if ($edad >= 18) echo "Eres mayor de edad."; echo "Puedes acceder.";
?>
Aunque visualmente pueda parecer que las dos líneas dependen del if, realmente solo la primera instrucción depende de la condición.
Por eso es mejor usar siempre llaves:
<?php
$edad = 20;
if ($edad >= 18) { echo "Eres mayor de edad."; echo "Puedes acceder."; }
?>
Esto evita errores y mejora la lectura.
50. Buenas prácticas con condicionales
Aunque los condicionales son sencillos de entender, conviene usarlos con orden.
Es recomendable escribir condiciones claras y fáciles de leer. Si una condición se vuelve demasiado larga, podemos guardarla en una variable.
if ($noches <= 0) { echo "El número de noches no es válido."; } elseif ($precioPorNoche <= 0) { echo "El precio por noche no es válido."; } else { $precioBase = $noches * $precioPorNoche;
Este ejemplo es bastante completo porque combina validación, cálculos y decisiones.
Ejercicios propuestos
Ejercicio 1: mayoría de edad
Crea un script PHP que guarde una edad en una variable y muestre si la persona es menor o mayor de edad.
Después modifica el programa para que también indique si la edad no es válida cuando sea menor que 0.
Ejercicio 2: nota de un alumno
Crea un programa que reciba una nota y muestre:
Suspenso si es menor que 5. Aprobado si está entre 5 y 6.99. Notable si está entre 7 y 8.99. Sobresaliente si está entre 9 y 10. Nota no válida si está fuera del rango de 0 a 10.
Ejercicio 3: login sencillo
Crea dos variables:
$usuario = "admin"; $password = "1234";
Después crea un condicional que compruebe si el usuario y la contraseña son correctos.
El programa debe comprobar si el producto tiene stock y si el usuario está registrado.
Si todo es correcto, debe mostrar que el producto se puede comprar.
Si no hay stock, debe indicar que el producto está agotado.
Si el usuario no está registrado, debe indicar que debe iniciar sesión.
Ejercicio 5: roles de usuario
Crea una variable $rol con uno de estos valores:
"admin" "editor" "cliente" "invitado"
Usa condicionales para mostrar un mensaje diferente según el rol.
Después repite el ejercicio usando switch.
Ejercicio 6: formulario de contacto
Crea un formulario HTML con los campos:
Nombre. Email. Mensaje.
Después crea un archivo PHP que valide:
Que el nombre no esté vacío. Que el email no esté vacío. Que el email tenga formato válido. Que el mensaje tenga al menos 10 caracteres.
Si todo es correcto, debe mostrar:
Formulario enviado correctamente
Resumen del tema
Los condicionales permiten que un programa tome decisiones.
La estructura más básica es if.
Cuando queremos ejecutar una alternativa usamos else.
Cuando tenemos varias posibilidades usamos elseif.
Para comparar una variable con muchos valores posibles podemos usar switch o match.
Los operadores de comparación permiten comprobar igualdad, diferencia, mayor que, menor que, etc.
Los operadores lógicos permiten combinar condiciones usando &&, || y !.
En PHP es importante diferenciar entre == y ===.
Los condicionales son fundamentales para validar formularios, controlar accesos, calcular descuentos, mostrar contenido según el usuario y proteger zonas privadas.
A partir de este punto, PHP deja de ser una simple secuencia de instrucciones y empieza a comportarse como un programa capaz de reaccionar ante distintas situaciones.
En programación hay muchas situaciones en las que necesitamos repetir una misma acción varias veces. Por ejemplo, mostrar los números del 1 al 10, recorrer una lista de productos, leer los datos de varios alumnos, calcular el total de un carrito o mostrar las filas de una tabla HTML.
Podríamos escribir el mismo código muchas veces, pero sería una mala solución. El código sería largo, difícil de mantener y muy propenso a errores. Para solucionar esto existen los bucles, también llamados estructuras repetitivas.
Un bucle permite ejecutar un bloque de código mientras se cumpla una condición o durante un número determinado de repeticiones.
En PHP trabajaremos principalmente con estas estructuras:
while
do while
for
foreach
Además, veremos instrucciones como break y continue, que nos permiten modificar el comportamiento normal de un bucle.
1. ¿Qué es un bucle?
Un bucle es una estructura que repite un bloque de instrucciones.
Imagina que queremos mostrar los números del 1 al 5.
Podríamos hacerlo así:
<?php echo 1; echo 2; echo 3; echo 4; echo 5; ?>
Funciona, pero no es práctico. Si tuviéramos que mostrar los números del 1 al 100, tendríamos que escribir cien líneas. Y si mañana queremos mostrar hasta el 1000, el problema sería todavía peor.
Con un bucle podemos hacerlo de forma mucho más limpia:
Mientras $numero sea menor o igual que 5, muestra el número y luego súmale 1.
El resultado será:
1 2 3 4 5
La clave de los bucles es entender que el programa no avanza simplemente de arriba hacia abajo una sola vez, sino que vuelve hacia atrás para repetir una parte del código.
2. Partes importantes de un bucle
Aunque cada tipo de bucle se escribe de forma diferente, casi todos tienen tres elementos importantes:
Primero, una variable de control, que normalmente sirve para contar o recorrer datos.
Segundo, una condición, que decide si el bucle debe seguir ejecutándose.
Tercero, una actualización, que modifica la variable de control para que el bucle pueda avanzar y terminar en algún momento.
El bucle empieza comprobando la condición. Si la condición es verdadera, entra dentro del bloque. Cuando termina el bloque, vuelve a comprobar la condición. Si sigue siendo verdadera, repite. Cuando la condición deja de cumplirse, el bucle termina.
Este ejemplo todavía está simplificado porque el intento está escrito directamente en el código. Más adelante podríamos recibir el valor desde un formulario usando $_POST.
Lo importante aquí es ver que el bucle puede depender de más de una condición.
La condición es:
$intento != $passwordCorrecta && $intentos < 3
Esto significa:
Mientras la contraseña sea incorrecta y queden intentos disponibles, el bucle podría repetirse.
4. El bucle do while
El bucle do while se parece mucho al while, pero tiene una diferencia muy importante.
En un while, primero se comprueba la condición y después se ejecuta el código.
En un do while, primero se ejecuta el código y después se comprueba la condición.
Su estructura es:
do { // Código que se repite } while (condición);
Observa que al final lleva punto y coma.
Ejemplo:
<?php $numero = 1;
do { echo "Número: " . $numero . "<br>"; $numero++; } while ($numero <= 5); ?>
El resultado será el mismo que antes:
Número: 1 Número: 2 Número: 3 Número: 4 Número: 5
La diferencia aparece cuando la condición inicialmente es falsa.
Diferencia entre while y do while
Ejemplo con while:
<?php $numero = 10;
while ($numero <= 5) { echo "Este mensaje no se muestra"; } ?>
Este código no muestra nada, porque la condición se comprueba antes de entrar.
Ahora el mismo caso con do while:
<?php $numero = 10;
do { echo "Este mensaje se muestra una vez"; } while ($numero <= 5); ?>
Aunque la condición es falsa, el bloque se ejecuta una vez antes de comprobarla.
Esto hace que do while sea útil cuando queremos que algo ocurra al menos una vez.
Ejemplo práctico: menú de opciones
Un caso típico de do while es un menú. Queremos mostrar el menú al menos una vez, y luego repetirlo si el usuario no elige salir.
En un programa de consola tendría mucho sentido. En PHP web no se usa exactamente igual porque las páginas web funcionan por peticiones, pero como ejercicio de lógica es muy útil.
<?php $opcion = 1;
do { echo "Menú principal<br>"; echo "1. Ver productos<br>"; echo "2. Ver carrito<br>"; echo "3. Salir<br><br>";
echo "Has elegido la opción: " . $opcion . "<br>";
$opcion++;
} while ($opcion <= 3); ?>
Este ejemplo simula que la opción va cambiando. Más adelante, cuando se trabaje con formularios o aplicaciones de consola, el valor podría venir del usuario.
5. El bucle for
El bucle for se utiliza mucho cuando sabemos cuántas veces queremos repetir algo.
Su estructura es:
for (inicio; condición; actualización) { // Código que se repite }
Los bucles y los condicionales se combinan constantemente.
Por ejemplo, podemos recorrer los números del 1 al 10 e indicar cuáles son pares y cuáles son impares.
<?php for ($i = 1; $i <= 10; $i++) { if ($i % 2 == 0) { echo $i . " es par<br>"; } else { echo $i . " es impar<br>"; } } ?>
El operador % calcula el resto de una división.
Si un número dividido entre 2 tiene resto 0, es par.
$i % 2 == 0
Este tipo de combinación es fundamental. Un bucle permite recorrer datos. Un condicional permite tomar decisiones sobre cada dato.
Ejemplo práctico: notas de alumnos
Supongamos que tenemos varias notas y queremos mostrar si cada una está aprobada o suspensa.
De momento usaremos un array sencillo. Aunque los arrays se estudien en profundidad más adelante, este ejemplo ayuda a entender muy bien la utilidad de los bucles.
Este ejemplo es muy parecido a lo que haríamos en una tienda online.
Cada producto tiene varios datos. El foreach exterior recorre todos los productos. En cada vuelta, la variable $producto contiene un producto completo.
Esta técnica se utiliza muchísimo: sumar precios, contar aprobados, calcular estadísticas, acumular puntos, contar errores, calcular importes de reservas, etc.
12. Contadores y acumuladores
En los bucles aparecen dos conceptos muy importantes: contador y acumulador.
Un contador normalmente suma de uno en uno. Sirve para contar cuántas veces ocurre algo.
Un acumulador va guardando una suma total o un resultado progresivo.
Ejemplo:
<?php $notas = [8, 4, 6, 3, 9, 5];
$aprobados = 0; $sumaNotas = 0;
foreach ($notas as $nota) { $sumaNotas = $sumaNotas + $nota;
if ($nota >= 5) { $aprobados++; } }
$media = $sumaNotas / count($notas);
echo "Aprobados: " . $aprobados . "<br>"; echo "Media de la clase: " . $media; ?>
En este ejemplo:
$aprobados es un contador.
$sumaNotas es un acumulador.
La variable $aprobados solo aumenta cuando la nota es mayor o igual que 5.
La variable $sumaNotas suma todas las notas.
13. break: salir de un bucle
La instrucción break permite terminar un bucle antes de que se cumpla su final normal.
Ejemplo:
<?php for ($i = 1; $i <= 10; $i++) { if ($i == 5) { break; }
echo $i . "<br>"; } ?>
Resultado:
1 2 3 4
Cuando $i vale 5, se ejecuta break y el bucle termina inmediatamente.
El producto "Ratón" no se muestra porque no tiene stock.
15. Bucles anidados
Un bucle anidado es un bucle dentro de otro bucle.
Esto puede parecer complicado al principio, pero es muy útil para trabajar con tablas, matrices, calendarios, tableros de juego o estructuras de filas y columnas.
Este ejemplo resume muy bien para qué sirven los bucles en PHP. No se trata solo de repetir código. Se trata de recorrer datos, analizarlos, tomar decisiones y construir una salida útil para el usuario.
30. Conclusión
Los bucles son una de las herramientas más importantes de cualquier lenguaje de programación. En PHP son especialmente útiles porque muchas veces necesitamos generar HTML a partir de datos.
Con un bucle podemos mostrar listas, construir tablas, recorrer productos, calcular totales, validar información o analizar conjuntos de datos.
El while es útil cuando dependemos de una condición.
El do while garantiza que el bloque se ejecute al menos una vez.
El for es ideal cuando sabemos cuántas veces queremos repetir.
El foreach es la herramienta principal para recorrer arrays.
Dominar los bucles es un paso fundamental antes de avanzar hacia arrays más complejos, formularios, bases de datos y aplicaciones web completas.
Cuando empezamos a crear páginas web con PHP, es habitual que al principio cada archivo tenga todo su código escrito dentro del mismo documento. Por ejemplo, podemos tener una página index.php, otra llamada contacto.php, otra llamada productos.php y otra llamada servicios.php. Cada una de ellas puede tener su propio HTML completo, con su cabecera, su menú, su contenido principal y su pie de página.
El problema aparece cuando varias páginas comparten partes iguales. Imaginemos que todas las páginas tienen el mismo menú de navegación. Si escribimos ese menú directamente en cada archivo, estaremos repitiendo el mismo código una y otra vez. Esto puede parecer cómodo al principio, pero en cuanto el proyecto crece se convierte en un problema.
Por ejemplo, si queremos añadir una nueva opción al menú, tendríamos que modificar manualmente todos los archivos del sitio web. Si tenemos cuatro páginas, todavía es manejable. Pero si tenemos veinte, cincuenta o cien páginas, mantener ese código repetido se vuelve lento, incómodo y muy propenso a errores.
Para solucionar este problema, PHP nos permite separar partes comunes del código en archivos independientes y después insertarlas donde las necesitemos. Para eso usamos principalmente las instrucciones include y require.
Estas instrucciones permiten cargar el contenido de un archivo dentro de otro. Dicho de forma sencilla, PHP lee el archivo indicado y coloca su contenido justo en el punto donde hemos escrito el include o el require.
Esto es especialmente útil para crear partes reutilizables de una página web, como:
La cabecera HTML.
El menú de navegación.
El pie de página.
Barras laterales.
Formularios comunes.
Bloques de conexión a bases de datos.
Configuraciones compartidas.
En este tema vamos a centrarnos en el uso más inicial y visual: reutilizar fragmentos HTML comunes en varias páginas PHP.
El problema del código repetido
Supongamos que tenemos una página sencilla llamada index.php.
Si observamos los tres archivos, vemos que hay mucho código repetido. La cabecera, el menú y el pie de página aparecen una y otra vez.
Esto no es una buena práctica. Si queremos cambiar el título principal del sitio, modificar el menú o actualizar el pie de página, tendremos que hacerlo en todos los archivos.
La solución consiste en separar esas partes comunes en archivos independientes.
Qué es include
La instrucción include permite insertar el contenido de un archivo dentro de otro archivo PHP.
Su estructura básica es la siguiente:
include "archivo.php";
Cuando PHP encuentra esta línea, intenta buscar el archivo indicado y colocar su contenido en ese punto exacto.
Por ejemplo:
include "menu.php";
Esto significa que PHP cargará el archivo menu.php y mostrará su contenido justo donde aparece el include.
Crear un archivo común para el menú
Vamos a separar el menú de navegación en un archivo independiente.
Este archivo no necesita tener una estructura HTML completa. No necesita <!DOCTYPE html>, ni <html>, ni <head>, ni <body>, porque no representa una página completa. Solo contiene una parte de la página.
Ahora, si queremos modificar el menú, solo tenemos que cambiar el archivo menu.php. Todas las páginas que lo incluyan mostrarán automáticamente el menú actualizado.
Separar también la cabecera y el pie de página
El menú no es la única parte que podemos reutilizar. También podemos separar la cabecera y el pie.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mi página web</title>
</head>
<body>
<?php include "header.php"; ?>
<?php include "menu.php"; ?>
<main>
<h2>Página de inicio</h2>
<p>Bienvenido a mi página web.</p>
</main>
<?php include "footer.php"; ?>
</body>
</html>
La página sigue funcionando igual, pero ahora está mejor organizada. Cada parte común está en su propio archivo.
Esta forma de trabajar es muy habitual en proyectos web. Permite dividir una página en piezas pequeñas, más fáciles de entender, mantener y reutilizar.
Una estructura básica de carpetas
Cuando un proyecto empieza a crecer, conviene organizar los archivos en carpetas.
Podemos crear una carpeta llamada includes para guardar los fragmentos comunes.
En este caso, como los archivos comunes están dentro de la carpeta includes, tenemos que indicar la ruta correctamente.
En index.php escribiríamos:
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<?php include "includes/footer.php"; ?>
La página completa quedaría así:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mi página web</title>
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2>Página de inicio</h2>
<p>Bienvenido a mi página web.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
Es importante entender que la ruta del archivo incluido depende de dónde se encuentra el archivo que está haciendo el include.
Si index.php está en la raíz del proyecto y header.php está dentro de la carpeta includes, la ruta correcta será:
include "includes/header.php";
Qué ocurre si el archivo no existe
Si usamos include y el archivo indicado no existe, PHP mostrará un aviso, pero intentará seguir ejecutando el resto de la página.
Por ejemplo:
<?php include "includes/cabecera.php"; ?>
Si el archivo cabecera.php no existe, PHP generará un mensaje de advertencia similar a este:
Warning: include(includes/cabecera.php): Failed to open stream...
Aunque aparezca el aviso, PHP intentará continuar con el resto del documento.
Esto puede ser útil en algunos casos, pero también puede ser peligroso si el archivo incluido es fundamental para que la página funcione correctamente.
Qué es require
La instrucción require también sirve para insertar el contenido de un archivo dentro de otro. Su uso es muy parecido al de include.
require "archivo.php";
La diferencia principal está en lo que ocurre si el archivo no se encuentra.
Con include, PHP muestra una advertencia y continúa ejecutando la página.
Con require, PHP muestra un error grave y detiene la ejecución.
Por ejemplo:
<?php require "includes/header.php"; ?>
Si el archivo existe, se carga normalmente. Pero si no existe, PHP detiene la página.
Esto tiene sentido cuando el archivo que estamos cargando es imprescindible.
Diferencia entre include y require
Aunque las dos instrucciones sirven para cargar archivos externos, no se comportan igual cuando hay un problema.
include se suele usar cuando el archivo que estamos cargando no es totalmente imprescindible. Si falla, la página puede seguir funcionando, aunque quizá no se muestre una parte concreta.
require se usa cuando el archivo es necesario para que la página funcione correctamente. Si el archivo no existe, lo mejor es detener la ejecución para evitar errores mayores.
Por ejemplo, en una página sencilla podríamos usar include para cargar un bloque visual como un aviso o una sección secundaria.
<?php include "includes/aviso.php"; ?>
Pero si en un proyecto más avanzado tenemos un archivo con la conexión a la base de datos, normalmente usaríamos require.
<?php require "includes/conexion.php"; ?>
En este tema estamos trabajando principalmente con HTML común, por lo que podemos empezar usando include. Más adelante, cuando trabajemos con configuración, sesiones, funciones o bases de datos, veremos que require puede ser más adecuado.
La palabra once significa “una vez”. Estas instrucciones cargan el archivo solo si no se ha cargado antes.
Esto es útil para evitar que el mismo archivo se incluya varias veces por error.
Por ejemplo:
<?php include_once "includes/menu.php"; ?>
Si el archivo menu.php ya se ha cargado antes, PHP no lo volverá a cargar.
Al principio, trabajando con cabeceras, menús y pies de página, normalmente nos bastará con include. Pero es importante conocer include_once y require_once, porque son muy habituales en proyectos más grandes.
Crear una plantilla básica reutilizable
Vamos a crear una estructura sencilla para una web con varias páginas.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Inicio</title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2>Inicio</h2>
<p>Esta es la página principal de nuestro sitio web.</p>
<p>El encabezado, el menú y el pie de página se cargan desde archivos externos.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
Creamos también la página servicios.php.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Servicios</title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2>Servicios</h2>
<p>En esta sección se mostrarían los servicios ofrecidos por la empresa o el proyecto.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
Y finalmente la página contacto.php.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Contacto</title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2>Contacto</h2>
<p>Desde esta página se podría mostrar un formulario de contacto.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
Con esta estructura ya tenemos una pequeña web dividida en partes reutilizables.
Si ahora queremos añadir una opción nueva al menú, solo tenemos que editar includes/menu.php.
Ahora no tenemos que cambiar manualmente el año cada vez que empiece uno nuevo. PHP lo calculará automáticamente.
Esto demuestra una de las ventajas de usar archivos .php para nuestros bloques comunes: pueden combinar HTML y código PHP.
Usar variables antes de incluir un archivo
También podemos preparar una variable en la página principal y usarla dentro de un archivo incluido.
Por ejemplo, podemos crear una variable llamada $tituloPagina.
En index.php:
<?php
$tituloPagina = "Inicio";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $tituloPagina; ?></title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2><?php echo $tituloPagina; ?></h2>
<p>Bienvenido a la página principal.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
También podríamos usar esa variable dentro de header.php.
Archivo includes/header.php:
<header>
<h1>Mi sitio web con PHP</h1>
<p>Estás visitando la sección: <?php echo $tituloPagina; ?></p>
</header>
Cuando index.php incluye header.php, el archivo incluido puede acceder a la variable $tituloPagina, porque se está insertando dentro del mismo contexto de ejecución.
Esto es muy útil, pero también exige orden. Si una variable se usa dentro de un archivo incluido, debemos asegurarnos de que se ha creado antes de hacer el include.
Ejemplo con varias páginas y título dinámico
Podemos aplicar la misma idea en todas las páginas.
Archivo index.php:
<?php
$tituloPagina = "Inicio";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $tituloPagina; ?></title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2><?php echo $tituloPagina; ?></h2>
<p>Bienvenido a la página principal.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
También conviene usar nombres claros. Un archivo llamado header.php se entiende mejor que uno llamado parte1.php. Un archivo llamado menu.php se entiende mejor que uno llamado navegacion2.php.
Otra recomendación importante es no abusar de los includes. Separar el código ayuda, pero si dividimos demasiado una página en muchos archivos pequeños sin necesidad, el proyecto puede volverse confuso. La idea es separar aquello que realmente se repite o que tiene sentido mantener de forma independiente.
En esta etapa inicial, lo más recomendable es usar include para partes visuales comunes como header.php, menu.php y footer.php.
Más adelante, cuando empecemos a trabajar con funciones, configuración, sesiones o bases de datos, tendrá sentido usar require o require_once para archivos imprescindibles.
Resumen práctico
include y require permiten cargar un archivo dentro de otro archivo PHP.
La instrucción include intenta cargar el archivo y, si no lo encuentra, muestra una advertencia pero permite que la página continúe ejecutándose.
La instrucción require también carga un archivo, pero si no lo encuentra detiene la ejecución de la página.
En proyectos web, estas instrucciones son muy útiles para evitar repetir código. Podemos crear archivos comunes como header.php, menu.php y footer.php, e incluirlos en todas las páginas que los necesiten.
Gracias a esto, nuestro proyecto queda más limpio, más ordenado y más fácil de mantener.
Actividad propuesta
Crea una pequeña web en PHP con tres páginas:
index.php
servicios.php
contacto.php
La web debe tener una carpeta llamada includes con los siguientes archivos:
header.php
menu.php
footer.php
Cada página debe cargar esos archivos usando include.
Además, cada página debe tener un contenido principal diferente dentro de la etiqueta <main>.
Como ampliación, crea una variable $tituloPagina en cada página y úsala para mostrar el título correspondiente tanto en la etiqueta <title> como dentro del contenido principal.
Preguntas de reflexión
¿Por qué no es recomendable copiar y pegar el mismo menú en todas las páginas de un sitio web?
¿Qué ventaja tiene guardar el menú en un archivo independiente?
¿Qué diferencia hay entre include y require?
¿Qué ocurre si usamos include y el archivo no existe?
¿Qué ocurre si usamos require y el archivo no existe?
¿Para qué podría servir include_once?
¿Por qué es importante organizar correctamente las carpetas de un proyecto?
¿Qué problemas pueden aparecer si indicamos mal la ruta de un archivo incluido?
<?php
$tituloPagina = "Inicio";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $tituloPagina; ?></title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2><?php echo $tituloPagina; ?></h2>
<p>Esta es la página principal del proyecto.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
En servicios.php, escribe:
<?php
$tituloPagina = "Servicios";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $tituloPagina; ?></title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2><?php echo $tituloPagina; ?></h2>
<p>En esta página se describen los servicios ofrecidos.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
En contacto.php, escribe:
<?php
$tituloPagina = "Contacto";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title><?php echo $tituloPagina; ?></title>
<link rel="stylesheet" href="css/estilos.css">
</head>
<body>
<?php include "includes/header.php"; ?>
<?php include "includes/menu.php"; ?>
<main>
<h2><?php echo $tituloPagina; ?></h2>
<p>Desde esta página se podría contactar con el sitio web.</p>
</main>
<?php include "includes/footer.php"; ?>
</body>
</html>
Cuando hayas terminado, abre el proyecto desde un servidor local como XAMPP, MAMP o un contenedor con Apache y PHP. Comprueba que las tres páginas muestran la misma cabecera, el mismo menú y el mismo pie de página.
Después modifica el archivo menu.php añadiendo una nueva opción llamada Blog.
En esta práctica vamos a aprender a montar Google Drive en Ubuntu como si fuera una unidad del sistema, pero sin sincronizar todos los archivos en el disco duro.
Esto significa que podremos acceder a los archivos de Google Drive desde el explorador de archivos de Ubuntu, o desde la terminal, pero los archivos no se descargarán todos automáticamente. Se irán leyendo bajo demanda cuando los abramos o los copiemos.
Para conseguirlo usaremos una herramienta llamada rclone.
2. Objetivos de la práctica
Al finalizar esta práctica, el alumno será capaz de:
Instalar rclone en Ubuntu.
Configurar una cuenta de Google Drive en rclone.
Montar Google Drive como una carpeta local.
Acceder a los archivos de Drive desde Ubuntu sin sincronizarlos.
Desmontar la unidad cuando sea necesario.
Crear un servicio para montar Google Drive automáticamente al iniciar sesión.
3. Requisitos previos
Para realizar esta práctica necesitas:
Un equipo con Ubuntu instalado.
Conexión a Internet.
Una cuenta de Google Drive.
Acceso a la terminal.
Permisos de administrador en el sistema.
4. ¿Qué es rclone?
rclone es una herramienta de línea de comandos que permite trabajar con servicios de almacenamiento en la nube como:
Google Drive.
OneDrive.
Dropbox.
Mega.
Amazon S3.
Nextcloud.
WebDAV.
En esta práctica lo usaremos para montar Google Drive como una unidad, no para sincronizarlo.
La diferencia es importante:
Opción
Qué hace
Sincronizar
Descarga y mantiene copias locales de los archivos
Montar
Muestra los archivos como si estuvieran en local, pero se accede a ellos bajo demanda
5. Instalación de rclone
Abrimos una terminal y actualizamos la lista de paquetes:
sudo apt update
Instalamos rclone y fuse3:
sudo apt install rclone fuse3
fuse3 permite que un usuario pueda montar sistemas de archivos virtuales, como en este caso Google Drive.
Comprobamos que rclone se ha instalado correctamente:
rclone version
Deberíamos ver una salida parecida a esta:
rclone v1.xx.x - os/version: ubuntu - os/kernel: linux - os/type: linux
6. Configuración de Google Drive en rclone
Ahora vamos a configurar la conexión con nuestra cuenta de Google Drive.
Ejecutamos:
rclone config
Aparecerá un menú en la terminal.
Como todavía no tenemos ninguna conexión configurada, elegimos la opción:
n
Esta opción significa:
New remote
Es decir, crear una nueva conexión remota.
6.1. Nombre de la conexión
Cuando pregunte por el nombre, escribimos:
gdrive
Podríamos poner otro nombre, pero para esta práctica usaremos gdrive.
Este nombre será el identificador que usaremos más adelante para referirnos a nuestro Google Drive.
6.2. Selección del tipo de almacenamiento
Después aparecerá una lista con muchos servicios de almacenamiento.
Buscamos la opción correspondiente a:
Google Drive
El número puede cambiar según la versión de rclone, así que no copies el número de otra guía sin mirar la lista.
Escribe el número que corresponda a Google Drive y pulsa Enter.
6.3. Client ID y Client Secret
rclone nos preguntará por:
client_id client_secret
Para una práctica normal podemos dejarlos vacíos pulsando Enter.
Esto usará la configuración genérica de rclone.
Si te pregunta algo mas que no sea scope dale a enter.
6.4. Scope o permisos de acceso
Cuando pregunte por el tipo de permisos o scope, elegimos la opción que permita acceso completo a Google Drive.
Normalmente aparece como:
drive
Esto permite leer y escribir archivos en Google Drive desde Ubuntu.
6.5. Configuración avanzada
Cuando pregunte si queremos configuración avanzada:
Edit advanced config?
Respondemos:
n
6.6. Autenticación con Google
Cuando pregunte:
Use auto config?
Si estamos en un Ubuntu con entorno gráfico, respondemos:
y
Se abrirá el navegador web para iniciar sesión con nuestra cuenta de Google.
Aceptamos los permisos solicitados por rclone.
Cuando el proceso termine, volvemos a la terminal.
6.7. Guardar configuración
Al final, rclone mostrará un resumen de la configuración.
Cuando pregunte si queremos guardar la conexión, respondemos:
y
Después salimos del menú de configuración con:
q
7. Comprobar que la conexión funciona
Para comprobar que podemos acceder a Google Drive, ejecutamos:
rclone lsd gdrive:
Este comando lista las carpetas principales de Google Drive.
Activamos el servicio para que arranque automáticamente:
systemctl --user enable rclone-gdrive
Iniciamos el servicio:
systemctl --user start rclone-gdrive
12.4. Comprobar el estado del servicio
Ejecutamos:
systemctl --user status rclone-gdrive
Si todo está bien, deberíamos ver algo parecido a:
Active: active (running)
Para salir de la pantalla de estado, pulsamos:
q
13. Detener el montaje automático
Si queremos parar el servicio temporalmente:
systemctl --user stop rclone-gdrive
Si queremos desactivarlo para que no arranque automáticamente:
systemctl --user disable rclone-gdrive
14. Posibles errores y soluciones
Error: la carpeta parece vacía
Primero comprueba si el montaje está activo:
systemctl --user status rclone-gdrive
O prueba a montar manualmente:
rclone mount gdrive: ~/GoogleDrive --vfs-cache-mode writes --daemon
Error: transport endpoint is not connected
A veces puede quedarse un montaje bloqueado.
Solución:
fusermount3 -u ~/GoogleDrive
Si no funciona:
fusermount3 -uz ~/GoogleDrive
Después vuelve a montar:
rclone mount gdrive: ~/GoogleDrive --vfs-cache-mode writes --daemon
Error: command not found
Si aparece:
rclone: command not found
Significa que rclone no está instalado.
Instálalo con:
sudo apt install rclone
Error: fusermount3 no encontrado
Instala fuse3:
sudo apt install fuse3
Error en el servicio por el nombre de usuario
Si el servicio no arranca, revisa esta parte:
ExecStart=/usr/bin/rclone mount gdrive: /home/antonio/GoogleDrive --vfs-cache-mode writes ExecStop=/bin/fusermount3 -u /home/antonio/GoogleDrive
Debes cambiar antonio por tu usuario real.
Puedes saber tu usuario con:
whoami
Y tu ruta personal con:
echo $HOME
15. Comandos principales de la práctica
Acción
Comando
Instalar rclone
sudo apt install rclone fuse3
Configurar Google Drive
rclone config
Ver carpetas de Drive
rclone lsd gdrive:
Crear carpeta de montaje
mkdir -p ~/GoogleDrive
Montar Drive
rclone mount gdrive: ~/GoogleDrive --vfs-cache-mode writes --daemon
Desmontar Drive
fusermount3 -u ~/GoogleDrive
Ver estado del servicio
systemctl --user status rclone-gdrive
Iniciar servicio
systemctl --user start rclone-gdrive
Parar servicio
systemctl --user stop rclone-gdrive
16. Ejercicio propuesto para el alumno
Realiza los siguientes pasos y documenta el proceso:
Instala rclone en Ubuntu.
Configura tu cuenta de Google Drive.
Crea la carpeta ~/GoogleDrive.
Monta Google Drive usando rclone mount.
Comprueba que puedes ver tus archivos desde el explorador.
Crea una carpeta de prueba dentro de ~/GoogleDrive.
Comprueba desde la web de Google Drive que la carpeta se ha creado.
Desmonta Google Drive.
Vuelve a montarlo manualmente.
Configura el montaje automático con systemd.
17. Preguntas de repaso
¿Qué diferencia hay entre sincronizar Google Drive y montarlo como unidad?
¿Para qué sirve rclone?
¿Qué significa gdrive: en los comandos usados?
¿Dónde se monta Google Drive en esta práctica?
¿Qué comando se usa para desmontar la unidad?
¿Qué ventaja tiene usar systemd en esta práctica?
¿Se descargan todos los archivos de Google Drive al montar la unidad?
¿Qué ocurre si copiamos un archivo dentro de ~/GoogleDrive?
18. Conclusión
En esta práctica hemos montado Google Drive en Ubuntu como una carpeta local usando rclone.
La ventaja principal de este método es que podemos trabajar con nuestros archivos de Google Drive desde Ubuntu sin tener que sincronizar todo el contenido en el disco duro.
Esto resulta muy útil en equipos con poco almacenamiento, máquinas virtuales, portátiles o entornos de laboratorio donde necesitamos acceso a archivos en la nube sin ocupar espacio innecesario.
Además, al configurar el montaje automático mediante systemd, conseguimos que Google Drive esté disponible cada vez que iniciemos sesión en Ubuntu.