Audio del tema Presentación del curso en audio (IA)
1. Presentación del curso de programación con Java
Bienvenido al curso de programación con Java. Este curso está pensado para aprender a programar desde la base, empezando por los conceptos más sencillos y avanzando poco a poco hasta llegar a la programación orientada a objetos, uno de los pilares fundamentales de Java y de muchos lenguajes modernos.
A lo largo del curso no vamos a limitarnos a memorizar instrucciones ni a copiar código sin entenderlo. El objetivo principal es aprender a pensar como programadores. Esto significa aprender a analizar problemas, dividirlos en partes más pequeñas, plantear soluciones ordenadas y convertir esas soluciones en programas que pueda ejecutar un ordenador.
Java será el lenguaje que utilizaremos para aprender estos conceptos. Es un lenguaje muy utilizado en el mundo profesional, especialmente en aplicaciones de empresa, aplicaciones web, aplicaciones móviles, sistemas de gestión, herramientas internas y muchos otros tipos de software. Además, Java es un lenguaje muy adecuado para aprender programación porque obliga a trabajar de forma ordenada y ayuda a comprender muy bien conceptos importantes como variables, condiciones, bucles, funciones, clases, objetos, herencia y estructuras de datos.
Durante el curso utilizaremos Eclipse como entorno de desarrollo. Eclipse es un IDE, es decir, un programa que nos ayuda a escribir, organizar, ejecutar y depurar nuestro código. Aunque al principio puede parecer una herramienta con muchas opciones, poco a poco iremos usando solamente las partes necesarias. La idea no es aprender Eclipse por aprender Eclipse, sino usarlo como herramienta para programar mejor.
Este primer curso será la base de una formación más amplia. Después de aprender los fundamentos de Java, se podrá continuar con tecnologías más avanzadas como Java EE y posteriormente Spring, que son herramientas muy utilizadas para crear aplicaciones web y sistemas empresariales. Por eso es importante construir ahora una base sólida. Si entendemos bien los fundamentos, todo lo que venga después será mucho más fácil de asimilar.
Programar no consiste en saber todas las instrucciones de memoria. De hecho, incluso los programadores profesionales consultan documentación, buscan ejemplos y revisan código continuamente. Lo importante es comprender cómo se resuelven los problemas y cómo se estructura un programa. Este curso pretende ayudarte precisamente en eso: a construir una forma de pensar lógica, ordenada y práctica.
Al principio trabajaremos con programas sencillos. Veremos cómo mostrar mensajes por pantalla, cómo pedir datos al usuario, cómo guardar información en variables y cómo tomar decisiones dentro de un programa. Después incorporaremos bucles para repetir acciones, métodos para organizar mejor el código y arrays para trabajar con conjuntos de datos.
Más adelante entraremos en la programación orientada a objetos. En ese momento empezaremos a representar elementos del mundo real mediante clases y objetos. Por ejemplo, podremos crear una clase Alumno, una clase Producto, una clase Coche o una clase Reserva. Cada una tendrá sus propios datos y sus propios comportamientos. Esta forma de programar permite crear aplicaciones más grandes, organizadas y fáciles de mantener.
Al final del curso también veremos una introducción a algunos tipos abstractos de datos, como pilas, colas, listas y una pequeña introducción a grafos. No se trata todavía de estudiarlos con una profundidad matemática avanzada, sino de entender para qué sirven y por qué son importantes en programación.
Este curso requiere práctica. Leer los apuntes ayuda, ver vídeos ayuda, escuchar explicaciones ayuda, pero se aprende a programar programando. Es normal equivocarse, encontrarse errores, no entender algo a la primera o tener que repetir un ejercicio varias veces. Eso forma parte del proceso. Cada error corregido ayuda a mejorar.
El objetivo final es que el alumno no solo sepa escribir pequeños programas en Java, sino que empiece a adquirir una mentalidad de desarrollador: analizar, probar, corregir, mejorar y documentar sus soluciones.
2. Qué es programar
Programar es darle instrucciones a un ordenador para que realice una tarea. Dicho así parece algo sencillo, pero detrás de esa idea hay una habilidad muy importante: saber transformar un problema en una serie de pasos claros, ordenados y precisos.
Un ordenador no interpreta las cosas como una persona. Las personas somos capaces de entender frases incompletas, deducir información por contexto o improvisar soluciones. Un ordenador, en cambio, necesita instrucciones concretas. Si una instrucción está mal escrita, si falta un paso o si el orden no es correcto, el programa no funcionará como esperamos.
Por ejemplo, imaginemos que queremos explicar a una persona cómo preparar un café. Podríamos decirle: “hazme un café”. Si esa persona sabe usar la cafetera, probablemente entenderá lo que queremos. Pero si tuviéramos que explicárselo a un ordenador o a una máquina completamente automática, tendríamos que ser mucho más precisos.
Tendríamos que indicar pasos como comprobar si hay agua, comprobar si hay café, encender la máquina, colocar el vaso, esperar a que termine el proceso y apagarla. Programar consiste precisamente en eso: describir un proceso de forma tan clara que una máquina pueda ejecutarlo.
En programación trabajamos constantemente con datos. Un programa puede recibir información, guardarla, modificarla, compararla y mostrar un resultado. Por ejemplo, un programa puede pedir la edad de una persona y decidir si es mayor de edad. También puede calcular el precio total de una compra, comprobar una contraseña, ordenar una lista de nombres o gestionar las reservas de un hotel.
Un programa no suele ser una única instrucción aislada. Normalmente está formado por muchas instrucciones que trabajan juntas. Algunas sirven para guardar información, otras para tomar decisiones, otras para repetir tareas y otras para organizar mejor el código.
Por ejemplo, si queremos hacer un programa que calcule si un alumno ha aprobado, podríamos pensar en algo como esto:
int nota = 7;
if (nota >= 5) { System.out.println("El alumno ha aprobado"); } else { System.out.println("El alumno ha suspendido"); }
Este pequeño ejemplo ya muestra varias ideas importantes. Hay una variable llamada nota, que guarda un valor numérico. Después hay una condición que comprueba si esa nota es mayor o igual que 5. Según el resultado de esa comprobación, el programa muestra un mensaje u otro.
Aunque el código sea corto, ya estamos haciendo algo esencial en programación: tomar una decisión. Los programas reales están llenos de decisiones de este tipo. Una aplicación bancaria decide si una operación es válida o no. Una tienda online decide si hay stock suficiente. Un videojuego decide si un personaje ha perdido vida. Una aplicación de reservas decide si una habitación está disponible.
Programar también implica aprender a dividir los problemas. Cuando un problema es pequeño, se puede resolver de forma directa. Pero cuando el programa crece, necesitamos organizarlo mejor. No podemos escribir todo el código mezclado sin ningún orden. Por eso existen funciones, métodos, clases, paquetes y estructuras que nos ayudan a mantener el programa limpio y comprensible.
Una parte importante de aprender a programar es aceptar que los errores son normales. Cuando un programa falla, no significa necesariamente que seamos malos programando. Significa que hay algo que revisar. Puede ser un error de sintaxis, una variable mal escrita, una condición mal planteada o una lógica incorrecta.
Los errores forman parte del aprendizaje. De hecho, una de las habilidades más importantes de un programador es saber leer errores, buscar la causa y corregirlos. Programar no es escribir código perfecto a la primera. Programar es construir una solución, probarla, detectar problemas y mejorarla.
También es importante entender que programar no es solo escribir código. Antes de escribir una línea, muchas veces hay que pensar. Hay que entender qué se quiere conseguir, qué datos necesitamos, qué pasos hay que seguir y qué resultado esperamos obtener. Si no entendemos el problema, difícilmente podremos resolverlo bien con código.
Por eso, en este curso no solo escribiremos programas. También aprenderemos a analizar ejercicios, plantear soluciones y explicar lo que hace nuestro código. Esa capacidad de razonar es lo que realmente permite avanzar.
3. Qué es Java y para qué se utiliza
Java es un lenguaje de programación creado para desarrollar aplicaciones de forma ordenada, segura y portable. Es uno de los lenguajes más utilizados en el mundo profesional y ha sido durante muchos años una referencia en el desarrollo de software.
Una de las características más importantes de Java es que permite escribir programas que pueden ejecutarse en diferentes sistemas operativos. Un programa Java puede funcionar en Windows, Linux o macOS siempre que el sistema tenga instalado el entorno adecuado para ejecutarlo. Esta idea se suele resumir con la frase: “escribe una vez, ejecuta en cualquier lugar”.
Para conseguir esto, Java no funciona exactamente igual que otros lenguajes que se compilan directamente para un sistema concreto. Cuando escribimos código Java, ese código se compila y se transforma en un formato intermedio llamado bytecode. Ese bytecode se ejecuta sobre la Máquina Virtual de Java, conocida como JVM.
La JVM actúa como una capa intermedia entre nuestro programa y el sistema operativo. Gracias a ella, el mismo programa puede ejecutarse en distintos entornos sin tener que reescribirlo desde cero.
De forma simplificada, el proceso sería el siguiente:
Primero escribimos un archivo con código Java, por ejemplo:
public class HolaMundo { public static void main(String[] args) { System.out.println("Hola, mundo"); } }
Después ese código se compila. Si no hay errores, se genera un archivo intermedio que puede ejecutar la JVM. Finalmente, la máquina virtual interpreta y ejecuta el programa.
Al principio, muchas partes de este código pueden parecer extrañas. Es normal. Todavía no es necesario entenderlo todo en profundidad. Más adelante veremos qué significa public class, qué es main, por qué se usan llaves { } y cómo se organiza un programa Java. Ahora lo importante es quedarse con la idea general: Java nos permite escribir instrucciones que el ordenador puede ejecutar.
Java se utiliza en muchos ámbitos. Uno de los más importantes es el desarrollo de aplicaciones empresariales. Muchas empresas utilizan Java para crear sistemas de gestión, aplicaciones internas, plataformas web, servicios backend, aplicaciones bancarias, herramientas de administración y sistemas que necesitan ser estables y escalables.
También se ha utilizado mucho en el desarrollo de aplicaciones Android. Aunque hoy en día Android también utiliza Kotlin, Java sigue siendo un lenguaje importante en ese ecosistema y muchos proyectos existentes están escritos total o parcialmente en Java.
Otro uso importante de Java está en el desarrollo de aplicaciones web. En este curso empezaremos por los fundamentos del lenguaje, pero más adelante se puede continuar con Java EE, Servlets, JSP, Spring Boot y otras tecnologías relacionadas con el desarrollo de aplicaciones web y servicios.
Java también se utiliza en educación porque permite aprender muy bien los conceptos fundamentales de la programación orientada a objetos. Aunque al principio puede parecer más estricto que otros lenguajes, esa exigencia ayuda a adquirir buenos hábitos. Java obliga a declarar tipos de datos, organizar el código en clases y seguir una estructura clara.
Por ejemplo, en Java una variable debe tener un tipo. Si queremos guardar un número entero, podemos escribir:
int edad = 20;
Si queremos guardar texto, usamos String:
String nombre = "Ana";
Y si queremos guardar un valor verdadero o falso, usamos boolean:
boolean aprobado = true;
Esta forma de trabajar ayuda a entender qué tipo de información estamos manejando en cada momento. El programa sabe que edad es un número, que nombre es texto y que aprobado representa una condición lógica.
Java es un lenguaje orientado a objetos. Esto significa que permite organizar el código utilizando clases y objetos. Una clase puede entenderse como un molde o plantilla. A partir de ese molde podemos crear objetos concretos.
Por ejemplo, podríamos tener una clase Alumno:
public class Alumno { String nombre; int edad; double notaMedia; }
Esa clase describe qué datos puede tener un alumno. Después, en un programa, podríamos crear alumnos concretos con sus propios valores. Esta forma de trabajar se parece bastante a cómo organizamos la realidad: tenemos entidades, características y acciones.
La programación orientada a objetos será una parte muy importante del curso, pero antes de llegar ahí necesitamos dominar la base: variables, operadores, condiciones, bucles, métodos y arrays. Intentar aprender objetos sin entender bien estos conceptos sería como intentar construir una casa sin tener buenos cimientos.
Java también tiene una gran comunidad y muchísima documentación. Esto es importante porque ningún programador trabaja completamente aislado. Cuando aprendemos un lenguaje, necesitamos ejemplos, documentación oficial, foros, librerías y herramientas. Java cuenta con un ecosistema muy amplio, lo que lo convierte en una opción sólida para aprender y para trabajar profesionalmente.
Otra ventaja de Java es que tiene una sintaxis parecida a otros lenguajes muy utilizados, como C#, JavaScript, C++ o PHP en algunos aspectos. Esto significa que, aunque cada lenguaje tiene sus propias características, aprender Java facilita después el aprendizaje de otros lenguajes. Muchos conceptos se repiten: variables, condiciones, bucles, funciones, clases, objetos y estructuras de datos.
En este curso, Java será nuestro medio para aprender programación. No se trata solamente de aprender comandos de Java, sino de usar Java para comprender cómo se construye un programa desde cero. Primero haremos ejercicios pequeños y controlados. Después iremos aumentando la dificultad. Con el tiempo, los programas tendrán más clases, más métodos y más lógica.
El objetivo no es correr, sino avanzar con seguridad. La programación requiere práctica constante, paciencia y una mentalidad de mejora. Java puede parecer exigente al principio, pero precisamente por eso es una herramienta excelente para aprender bien.
Al terminar esta primera parte del curso, el alumno debería ser capaz de leer y escribir programas básicos en Java, entender la estructura de un programa, utilizar variables, condiciones, bucles, métodos, arrays y comenzar a trabajar con clases y objetos. Esa base será imprescindible para continuar después con tecnologías más avanzadas del ecosistema Java.
Después de esa base inicial, el curso avanzará hacia la programación orientada a objetos, uno de los pilares fundamentales de Java. Aprenderemos a diseñar clases, crear objetos, aplicar encapsulación, trabajar con relaciones entre clases, usar herencia, polimorfismo, clases abstractas e interfaces. La idea no es solo aprender la sintaxis del lenguaje, sino entender cómo se piensa y se organiza una aplicación real.
En la parte final se introducen conceptos algo más avanzados relacionados con los tipos abstractos de datos, como pilas, colas, listas y una primera aproximación a los grafos. Estos contenidos servirán como puente hacia una comprensión más profunda de las estructuras que se utilizan en programación y prepararán el camino para cursos posteriores.
Este será el primero de tres grandes módulos. Una vez asentadas las bases de Java, continuaremos con el desarrollo de aplicaciones web mediante Java EE y, posteriormente, con Spring/Spring Boot, donde aplicaremos estos conocimientos en proyectos más completos y cercanos al desarrollo profesional.
Bloque 1 — Introducción al curso y entorno de trabajo
Presentación del curso de programación con Java
Qué es programar
Qué es Java y para qué se utiliza
Instalación del JDK
Instalación de Eclipse
Configuración inicial de Eclipse
Creación del primer proyecto Java
Estructura básica de un programa Java
Primer programa: Hola Mundo
Compilar, ejecutar y corregir errores básicos
Bloque 2 — Primeros conceptos de programación
Algoritmos y pensamiento computacional
Instrucciones y flujo de ejecución
Datos, memoria y variables
Tipos de datos primitivos en Java
Constantes
Conversión de tipos
Entrada de datos por teclado con Scanner
Salida de datos por consola
Comentarios y buenas prácticas iniciales
Errores comunes al empezar a programar
Bloque 3 — Operadores y expresiones
Operadores aritméticos
Operadores de asignación
Operadores relacionales
Operadores lógicos
Incremento y decremento
Prioridad de operadores
Expresiones simples y compuestas
Ejercicios básicos de cálculo
Validación de expresiones
Depuración básica en Eclipse
Bloque 4 — Estructuras condicionales
Toma de decisiones en programación
Condicional if
Condicional if else
Condicionales anidados
Condiciones múltiples
Operadores lógicos en condiciones
Estructura switch
Menús básicos con switch
Validación de datos con condicionales
Ejercicios prácticos de decisiones
Bloque 5 — Bucles y control de flujo
Introducción a los bucles
Bucle while
Bucle do while
Bucle for
Contadores y acumuladores
Bucles anidados
Control de bucles con break
Control de bucles con continue
Validación repetitiva de datos
Ejercicios prácticos con bucles
Bloque 6 — Métodos y organización del código
Qué es un método
Métodos sin parámetros y sin retorno
Métodos con parámetros
Métodos con valor de retorno
Parámetros y argumentos
Variables locales
Alcance de las variables
Sobrecarga de métodos
Organización del código en métodos
Ejercicios prácticos con métodos
Bloque 7 — Arrays y estructuras básicas de datos
Introducción a los arrays
Declaración y creación de arrays
Recorrido de arrays
Carga de datos en arrays
Búsqueda de elementos
Cálculos con arrays
Arrays de cadenas de texto
Arrays multidimensionales
Matrices en Java
Ejercicios prácticos con arrays y matrices
Bloque 8 — Cadenas de texto y clases básicas de Java
La clase String
Métodos principales de String
Comparación de cadenas
Conversión entre texto y números
La clase Math
Números aleatorios con Random
Fechas básicas con Java
Formateo básico de datos
Uso de clases de utilidad
Ejercicios prácticos con cadenas y utilidades
Bloque 9 — Introducción a la programación orientada a objetos
Qué es la programación orientada a objetos
Clases y objetos
Atributos
Métodos
Creación de objetos
Acceso a atributos y métodos
Estado y comportamiento
Diseño básico de clases
Diagramas sencillos de clases
Primeros ejercicios con objetos
Bloque 10 — Constructores, encapsulación y organización de clases
Constructores
Constructor por defecto
Constructores con parámetros
Sobrecarga de constructores
Encapsulación
Modificadores de acceso
Métodos get y set
Uso de this
Separación de clases en archivos
Ejercicios prácticos de encapsulación
Bloque 11 — Relaciones entre clases
Objetos como atributos
Asociación entre clases
Composición
Agregación
Colecciones de objetos usando arrays
Clases principales y clases auxiliares
Diseño de pequeños modelos de datos
Programas con varias clases
Diagramas UML básicos
Proyecto guiado con varias clases
Bloque 12 — Herencia y reutilización de código
Introducción a la herencia
Clases padre y clases hijas
Uso de extends
Herencia de atributos y métodos
Sobrescritura de métodos
Uso de super
Constructores en herencia
Jerarquías de clases
Ventajas y límites de la herencia
Ejercicios prácticos con herencia
Bloque 13 — Polimorfismo, clases abstractas e interfaces
Introducción al polimorfismo
Referencias de tipo padre
Sobrescritura y comportamiento dinámico
Conversión entre tipos de objetos
Clases abstractas
Métodos abstractos
Interfaces
Implementación de interfaces
Diferencias entre clase abstracta e interfaz
Ejercicios prácticos de polimorfismo
Bloque 14 — Gestión de errores y excepciones
Errores de compilación
Errores de ejecución
Errores lógicos
Introducción a las excepciones
Bloque try catch
Captura de varias excepciones
Bloque finally
Lanzamiento de excepciones
Validación robusta de programas
Ejercicios prácticos con excepciones
Bloque 15 — Colecciones básicas de Java
Limitaciones de los arrays
Introducción a las colecciones
ArrayList
Recorrido de colecciones
Búsqueda en colecciones
Eliminación de elementos
Colecciones de objetos
Ordenación básica
Diferencias entre arrays y colecciones
Ejercicios prácticos con ArrayList
Bloque 16 — Proyecto final del curso
Planteamiento del proyecto final
Análisis de requisitos
Diseño de clases
Creación del proyecto en Eclipse
Desarrollo del modelo de datos
Desarrollo de la lógica del programa
Creación de menús por consola
Validación de entradas
Pruebas y corrección de errores
Presentación del proyecto final
Bloque 17 — Introducción a los tipos abstractos de datos
Qué es un tipo abstracto de datos
Diferencia entre estructura lógica y estructura física
Estructuras estáticas
Estructuras dinámicas
Pilas estáticas
Pilas dinámicas
Colas estáticas
Colas dinámicas
Listas enlazadas básicas
Listas simplemente enlazadas
Listas doblemente enlazadas
Comparación entre arrays, listas, pilas y colas
Introducción a los árboles
Introducción a los grafos
Representación básica de grafos
Recorrido básico de grafos
Ejercicios introductorios de tipos abstractos de datos
En este tema vamos a preparar el entorno de trabajo que usaremos durante el curso de programación con Java. Antes de empezar a escribir programas necesitamos instalar dos piezas fundamentales: el JDK, que contiene las herramientas necesarias para compilar y ejecutar programas Java, y Eclipse, que será el entorno de desarrollo desde el que escribiremos, organizaremos y probaremos nuestros proyectos.
Actualmente, Oracle indica que JDK 26 es la versión más reciente de Java y que JDK 25 es la última versión LTS, es decir, una versión de soporte a largo plazo. Para un curso de programación es recomendable trabajar con una versión LTS porque ofrece más estabilidad. También se puede usar JDK 21 LTS si el centro o el profesor quiere mantener compatibilidad con entornos ya instalados.
Eclipse también se mantiene actualizado y la versión Eclipse IDE 2026-03 incluye soporte para Java 25, además de herramientas para Java, Git, Maven y Gradle.
1. Instalación del JDK 📹
Qué es el JDK
Para poder programar en Java necesitamos instalar el JDK, siglas de Java Development Kit. El JDK es el conjunto de herramientas que permite desarrollar aplicaciones Java. Incluye, entre otras cosas, el compilador, la máquina virtual de Java y diferentes utilidades necesarias para trabajar desde consola o desde un entorno de desarrollo como Eclipse.
Es importante distinguir tres conceptos:
Java es el lenguaje de programación.
JVM, o Java Virtual Machine, es la máquina virtual que ejecuta los programas Java.
JDK es el paquete completo para desarrolladores. Incluye la JVM, el compilador y otras herramientas.
Cuando escribimos un programa Java, normalmente lo guardamos en un archivo con extensión .java. Ese archivo contiene código fuente, es decir, código escrito por una persona. Después, el compilador de Java transforma ese archivo en un archivo .class, que contiene bytecode. Ese bytecode será ejecutado por la JVM.
El proceso básico sería este:
Escribimos un archivo llamado HolaMundo.java.
Lo compilamos.
Se genera un archivo llamado HolaMundo.class.
La JVM ejecuta ese archivo compilado.
Qué versión instalar
Para este curso se recomienda instalar una versión LTS de Java. En este momento, la versión recomendada para un entorno nuevo sería JDK 25 LTS, porque Oracle la identifica como la última versión LTS.
También podemos usar Eclipse Temurin, que es una distribución gratuita y muy utilizada del JDK. Adoptium ofrece descargas de Temurin para distintas versiones LTS, incluyendo JDK 25, JDK 21, JDK 17, JDK 11 y JDK 8.
Para el alumno, la recomendación sencilla es:
Instalar JDK 25 LTS, preferiblemente desde Oracle o desde Eclipse Adoptium Temurin.
Instalación en Windows 📹
En Windows podemos instalar el JDK descargando el instalador desde la página oficial. El alumno debe elegir la versión correspondiente a su sistema operativo, normalmente Windows x64 Installer.
Una vez descargado el instalador, se ejecuta y se siguen los pasos del asistente. Lo normal es aceptar la ruta de instalación por defecto. Una ruta habitual puede ser parecida a esta:
C:\Program Files\Java\jdk-25
Después de instalar el JDK, conviene comprobar que Windows reconoce Java desde la terminal.
Para ello, abrimos Símbolo del sistema o PowerShell y escribimos:
java -version
Deberíamos ver una salida parecida a esta:
java version "25..." Java(TM) SE Runtime Environment ... Java HotSpot(TM) 64-Bit Server VM ...
También debemos comprobar que funciona el compilador:
javac -version
El comando java sirve para ejecutar programas Java. El comando javac sirve para compilar archivos .java.
Si java -version funciona pero javac -version no funciona, normalmente significa que no se ha instalado el JDK completo o que la variable PATH no está bien configurada.
Variables de entorno en Windows
En algunos equipos, después de instalar el JDK, Windows no reconoce los comandos java o javac. En ese caso hay que revisar las variables de entorno.
La variable más importante es PATH. Esta variable le dice al sistema operativo en qué carpetas debe buscar los comandos.
La carpeta que debemos añadir al PATH suele ser la carpeta bin del JDK. Por ejemplo:
C:\Program Files\Java\jdk-25\bin
También se puede crear una variable llamada JAVA_HOME, que apunte a la carpeta principal del JDK:
C:\Program Files\Java\jdk-25
Después, en el PATH, se puede añadir:
%JAVA_HOME%\bin
Una vez hecho esto, hay que cerrar y volver a abrir la terminal. Si dejamos abierta la terminal antigua, es posible que no detecte los cambios.
Instalación en macOS
En macOS también podemos instalar el JDK desde Oracle o desde Eclipse Adoptium. Si se descarga desde la web, normalmente obtendremos un archivo .pkg, que se instala siguiendo el asistente.
Una vez instalado, abrimos la aplicación Terminal y comprobamos:
java -version
Y también:
javac -version
Si ambos comandos devuelven una versión, el JDK está instalado correctamente.
En macOS también se puede comprobar qué versiones de Java están instaladas con:
/usr/libexec/java_home -V
Este comando muestra las instalaciones de Java detectadas por el sistema.
Instalación en Linux
En Linux podemos instalar Java desde los repositorios de la distribución o descargarlo desde Oracle/Adoptium.
En Ubuntu o distribuciones basadas en Debian, una instalación sencilla sería:
sudo apt update sudo apt install openjdk-25-jdk
Si la versión 25 no estuviera disponible en los repositorios de la distribución, se puede instalar una versión LTS disponible, como Java 21:
sudo apt update sudo apt install openjdk-21-jdk
Después comprobamos:
java -version javac -version
En Linux también podemos localizar dónde está instalado Java con:
which java which javac
2. Instalación de Eclipse 📹
Qué es Eclipse
Eclipse es un IDE, es decir, un entorno de desarrollo integrado. Un IDE es una aplicación que reúne en un mismo lugar varias herramientas necesarias para programar: editor de código, explorador de proyectos, compilación, ejecución, depuración, resaltado de errores, autocompletado y gestión de librerías.
Podríamos escribir programas Java usando solamente un editor de texto y la terminal, pero para aprender resulta mucho más cómodo utilizar un IDE. Eclipse nos ayuda a detectar errores, organizar los proyectos y ejecutar el programa con un botón.
Para este curso nos interesa especialmente la versión Eclipse IDE for Java Developers, que incluye las herramientas esenciales para programar en Java. La página oficial de Eclipse la describe como una distribución con herramientas para desarrollo Java, cliente Git, editor XML e integración con Maven y Gradle.
Qué versión de Eclipse descargar
Para este curso podemos usar:
Eclipse IDE for Java Developers
Esta versión es suficiente para aprender Java desde cero, trabajar con clases, paquetes, proyectos, consola, depuración y ejercicios de programación.
Más adelante, cuando el alumno avance hacia Java EE, Servlets, JSP, Maven, servidores y aplicaciones web, puede ser interesante instalar:
Eclipse IDE for Enterprise Java and Web Developers
Esta otra versión incluye herramientas adicionales para aplicaciones web, JavaScript, JSP, JPA, Maven, Gradle, Git y desarrollo empresarial.
Para este primer curso básico de Java, con Eclipse IDE for Java Developers es suficiente.
Instalación en Windows
Para instalar Eclipse en Windows, descargamos el instalador desde la página oficial de Eclipse. Una vez descargado, ejecutamos el instalador y seleccionamos:
Eclipse IDE for Java Developers
El instalador preguntará dónde queremos instalar Eclipse. Se puede dejar la ruta por defecto. También nos preguntará qué versión de Java queremos usar. Si el JDK está bien instalado, Eclipse debería detectarlo automáticamente.
Una vez terminado el proceso, podremos iniciar Eclipse desde el menú de inicio o desde el acceso directo creado.
Instalación en macOS
En macOS descargamos Eclipse desde la página oficial. Normalmente obtendremos un archivo .dmg. Lo abrimos y copiamos Eclipse a la carpeta Aplicaciones.
Al abrir Eclipse por primera vez, macOS puede mostrar un aviso de seguridad porque es una aplicación descargada de Internet. Si aparece ese aviso, debemos permitir su ejecución desde los ajustes de seguridad del sistema.
Instalación en Linux
En Linux podemos descargar Eclipse desde su página oficial como archivo comprimido, descomprimirlo y ejecutar el programa. Otra opción es usar el instalador oficial de Eclipse.
Un ejemplo de instalación manual sería:
cd Descargas tar -xzf eclipse-inst-jre-linux64.tar.gz cd eclipse-installer ./eclipse-inst
Después seleccionamos:
Eclipse IDE for Java Developers
Y seguimos el asistente.
3. Configuración inicial de Eclipse 📹
La primera vez que abrimos Eclipse, nos pedirá seleccionar un workspace.
El workspace es la carpeta donde Eclipse guardará nuestros proyectos. Es importante elegir una ubicación ordenada, porque ahí se irán creando todos los ejercicios del curso.
Por ejemplo, podemos crear una carpeta llamada:
CursoJava
En Windows podría estar en:
C:\Users\Alumno\Documents\CursoJava
En macOS o Linux podría estar en:
/home/alumno/CursoJava
O en macOS:
/Users/alumno/CursoJava
Una buena práctica es no guardar los proyectos en carpetas mezcladas con descargas, escritorio lleno de archivos o rutas difíciles de encontrar.
Selección del workspace
Cuando aparezca la ventana de selección de workspace, elegimos la carpeta donde queremos trabajar.
Podemos marcar la opción:
Use this as the default and do not ask again
Esto hará que Eclipse abra siempre ese workspace por defecto.
Si más adelante queremos cambiar de workspace, podemos hacerlo desde:
File > Switch Workspace
Configurar el JDK en Eclipse
Aunque Eclipse suele detectar automáticamente el JDK instalado, conviene revisar la configuración.
Vamos a:
Window > Preferences
En macOS puede aparecer como:
Eclipse > Settings
Después entramos en:
Java > Installed JREs
Aquí deberíamos ver el JDK instalado. Es importante que aparezca un JDK y no solamente un JRE. El JRE sirve para ejecutar programas, pero el JDK incluye también las herramientas de desarrollo.
Si no aparece, podemos añadirlo manualmente con:
Add > Standard VM
Y seleccionamos la carpeta donde está instalado el JDK.
Es recomendable configurar Eclipse para trabajar con UTF-8. Esto evita problemas con tildes, eñes y caracteres especiales.
Vamos a:
Window > Preferences > General > Workspace
Buscamos la opción:
Text file encoding
Y seleccionamos:
UTF-8
Esto es especialmente importante porque en nuestros programas podemos escribir textos como:
System.out.println("Hola, ¿qué tal?");
Si la codificación no está bien configurada, algunos caracteres podrían verse mal.
Configurar el tamaño de letra
Para trabajar cómodamente en clase, especialmente si el profesor proyecta la pantalla, podemos aumentar el tamaño de letra del editor.
La ruta puede variar según la versión, pero normalmente está en:
Window > Preferences > General > Appearance > Colors and Fonts
Después buscamos:
Java > Java Editor Text Font
Y ajustamos el tamaño.
Mostrar números de línea
Los números de línea son muy útiles para corregir errores. Cuando Java muestra un error, normalmente indica en qué línea se ha producido.
Para activar los números de línea:
Window > Preferences > General > Editors > Text Editors
Marcamos:
Show line numbers
A partir de ese momento, el editor mostrará un número al lado de cada línea de código.
4. Creación del primer proyecto Java
Una vez instalado y configurado Eclipse, vamos a crear nuestro primer proyecto.
Un proyecto en Eclipse es una carpeta organizada que contiene nuestros archivos Java, configuraciones y recursos. Para cada bloque de ejercicios podemos crear un proyecto diferente, o bien trabajar con un único proyecto organizado por paquetes.
Para empezar, crearemos un proyecto sencillo.
Vamos a:
File > New > Java Project
Si no aparece directamente, podemos ir a:
File > New > Other > Java > Java Project
En el nombre del proyecto escribimos:
PrimerProyectoJava
Después revisamos que Eclipse esté usando el JDK correcto.
En la parte de configuración del proyecto podemos dejar las opciones por defecto. Eclipse creará una carpeta src, donde escribiremos el código fuente.
Pulsamos:
Finish
Y veremos el proyecto en el panel izquierdo, llamado normalmente Package Explorer.
Crear una clase Java
Dentro del proyecto vamos a crear una clase.
Hacemos clic derecho sobre la carpeta src:
New > Class
En el nombre de la clase escribimos:
HolaMundo
Marcamos la opción:
public static void main(String[] args)
Esta opción hace que Eclipse cree automáticamente el método principal del programa.
Pulsamos:
Finish
Eclipse creará un archivo llamado:
HolaMundo.java
Ese archivo contendrá una estructura parecida a esta:
public class HolaMundo {
public static void main(String[] args) {
}
}
Estructura básica de un programa Java
Antes de escribir nuestro primer programa completo, vamos a entender la estructura mínima de un programa Java.
Un programa Java básico suele estar formado por una clase y un método main.
Ejemplo:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Vamos a analizarlo poco a poco.
La clase
Esta línea declara una clase:
public class HolaMundo {
En Java, casi todo el código se escribe dentro de clases. La clase es una estructura fundamental del lenguaje. Más adelante, cuando estudiemos programación orientada a objetos, veremos las clases con mucho más detalle.
De momento, podemos pensar que una clase es una especie de contenedor donde escribimos código.
El nombre de la clase es:
HolaMundo
Por norma general, el archivo debe llamarse igual que la clase pública. Por eso, si la clase se llama HolaMundo, el archivo debe llamarse:
HolaMundo.java
Esto es importante. Si el archivo no se llama igual que la clase pública, Java mostrará un error.
Las llaves
En Java se usan llaves { } para delimitar bloques de código.
Por ejemplo:
public class HolaMundo {
}
Todo lo que está dentro de esas llaves pertenece a la clase HolaMundo.
También el método main tiene sus propias llaves:
public static void main(String[] args) {
}
Todo lo que escribamos dentro de esas llaves será parte del método principal.
Uno de los errores más comunes al empezar es borrar una llave sin querer o colocarla en un sitio incorrecto. Cuando esto ocurre, Eclipse suele marcar errores en varias líneas, aunque el problema real sea una sola llave mal colocada.
El método main
El método main es el punto de entrada del programa. Cuando ejecutamos una aplicación Java, Java busca este método para saber por dónde debe empezar.
La estructura es:
public static void main(String[] args) {
}
Al principio no hace falta memorizar cada palabra, pero sí debemos acostumbrarnos a reconocerlo. Durante las primeras clases lo usaremos constantemente.
Podemos verlo como la puerta de entrada del programa.
Cuando damos al botón de ejecutar, Java entra en el método main y empieza a ejecutar las instrucciones que hay dentro, de arriba abajo.
Instrucciones
Dentro del método main escribimos instrucciones.
Por ejemplo:
System.out.println("Hola Mundo");
Esta instrucción muestra un texto por pantalla, concretamente en la consola de Eclipse.
La instrucción termina con punto y coma:
;
En Java, muchas instrucciones terminan con punto y coma. Olvidar el punto y coma es uno de los errores más habituales al empezar.
Comentarios
Los comentarios son partes del código que Java ignora. Sirven para dejar explicaciones para nosotros o para otros programadores.
Comentario de una línea:
// Esto es un comentario de una línea
Comentario de varias líneas:
/* Esto es un comentario de varias líneas */
Ejemplo completo:
public class HolaMundo {
public static void main(String[] args) { // Mostramos un mensaje por pantalla System.out.println("Hola Mundo"); }
}
Los comentarios son útiles, pero no conviene abusar de ellos. Un buen comentario explica algo que no es evidente, no repite lo mismo que ya dice el código.
6. Primer programa: Hola Mundo
El primer programa tradicional en casi cualquier lenguaje de programación es Hola Mundo. Es un programa muy sencillo que sirve para comprobar que el entorno está bien instalado y que somos capaces de crear, compilar y ejecutar código.
Nuestro programa será este:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Cuando lo ejecutemos, veremos en la consola:
Hola Mundo
Aunque parezca un programa muy simple, aquí ya están apareciendo varias ideas importantes:
Estamos creando una clase.
Estamos usando el método principal main.
Estamos escribiendo una instrucción.
Estamos mostrando información por consola.
Estamos usando comillas para escribir texto.
Estamos terminando la instrucción con punto y coma.
Estamos ejecutando un programa Java real.
Mostrar varios mensajes
Podemos escribir más de una instrucción:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); System.out.println("Estoy aprendiendo Java"); System.out.println("Este es mi primer programa"); }
}
La salida será:
Hola Mundo Estoy aprendiendo Java Este es mi primer programa
Java ejecuta las instrucciones en orden, desde la primera hasta la última.
Diferencia entre println y print
System.out.println muestra un texto y después hace un salto de línea.
Vamos a hacer un programa que muestre una pequeña ficha del alumno:
public class FichaAlumno {
public static void main(String[] args) { System.out.println("===== FICHA DEL ALUMNO ====="); System.out.println("Nombre: Antonio"); System.out.println("Curso: Programación con Java"); System.out.println("Editor: Eclipse"); System.out.println("Lenguaje: Java"); System.out.println("============================"); }
}
Salida:
===== FICHA DEL ALUMNO ===== Nombre: Antonio Curso: Programación con Java Editor: Eclipse Lenguaje: Java ============================
Este ejemplo sigue siendo muy básico, pero ya nos permite practicar la escritura de instrucciones, el uso de textos y la ejecución de programas.
7. Compilar, ejecutar y corregir errores básicos
Qué significa compilar
Compilar es transformar el código fuente que hemos escrito en un formato que pueda ejecutar la máquina virtual de Java.
El archivo que escribimos nosotros tiene extensión:
.java
Por ejemplo:
HolaMundo.java
Al compilarlo, Java genera un archivo con extensión:
.class
Por ejemplo:
HolaMundo.class
Ese archivo .class contiene bytecode, que será ejecutado por la JVM.
En Eclipse, normalmente no tenemos que compilar manualmente. Eclipse compila automáticamente cada vez que guardamos el archivo, siempre que la opción de construcción automática esté activada.
Podemos comprobarlo en:
Project > Build Automatically
Lo normal es dejar esta opción activada.
Ejecutar un programa en Eclipse
Para ejecutar un programa Java en Eclipse, abrimos la clase que contiene el método main.
Después podemos pulsar el botón verde de ejecutar, con forma de play.
También podemos hacer clic derecho sobre el archivo y elegir:
Run As > Java Application
Si todo está correcto, la salida aparecerá en la pestaña Console.
Por ejemplo, si ejecutamos:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Veremos:
Hola Mundo
Ejecutar desde consola
Aunque durante el curso trabajaremos principalmente con Eclipse, conviene entender cómo se ejecutaría un programa desde consola.
Supongamos que tenemos este archivo:
HolaMundo.java
Con este contenido:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo desde consola"); }
}
Para compilarlo desde terminal:
javac HolaMundo.java
Si no hay errores, se generará:
HolaMundo.class
Para ejecutarlo:
java HolaMundo
Importante: al ejecutar no escribimos .class.
Correcto:
java HolaMundo
Incorrecto:
java HolaMundo.class
La salida será:
Hola Mundo desde consola
8. Errores básicos al empezar con Java
Cuando empezamos a programar, los errores son normales. No significan que lo estemos haciendo mal. Significan que estamos aprendiendo a comunicarnos con el lenguaje.
Lo importante es aprender a leer el error, localizar la línea y corregirlo con calma.
Error 1: olvidar el punto y coma
Código incorrecto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo") }
}
El problema está aquí:
System.out.println("Hola Mundo")
Falta el punto y coma al final.
Código correcto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
En Java, muchas instrucciones terminan con ;. Si falta, Eclipse marcará un error de sintaxis.
Error 2: escribir mal System
Código incorrecto:
public class HolaMundo {
public static void main(String[] args) { system.out.println("Hola Mundo"); }
}
El problema es que hemos escrito system con minúscula.
En Java se distinguen mayúsculas y minúsculas. No es lo mismo:
System
Que:
system
Código correcto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Este concepto se llama case sensitive. Java diferencia entre mayúsculas y minúsculas en nombres de clases, variables, métodos y palabras del lenguaje.
Error 3: olvidar las comillas en un texto
Código incorrecto:
public class HolaMundo {
public static void main(String[] args) { System.out.println(Hola Mundo); }
}
El texto debe ir entre comillas dobles.
Código correcto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Cuando escribimos texto literal, usamos comillas dobles:
"Hola Mundo"
Error 4: nombre de clase y archivo diferentes
Supongamos que el archivo se llama:
HolaMundo.java
Pero dentro escribimos:
public class PrimerPrograma {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Esto dará error porque la clase pública se llama PrimerPrograma, pero el archivo se llama HolaMundo.java.
En Java, si una clase es pública, el archivo debe llamarse igual.
Solución 1: cambiar el nombre de la clase:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Solución 2: cambiar el nombre del archivo a:
PrimerPrograma.java
Error 5: borrar una llave
Código incorrecto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo");
}
Falta una llave de cierre. Tenemos una llave para abrir la clase y otra para abrir el método main, pero solo una llave de cierre.
Código correcto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
Una buena costumbre es escribir las llaves de forma ordenada y tabular bien el código. Eclipse puede ayudarnos con el formateo automático.
Podemos usar:
Source > Format
O el atajo habitual:
Ctrl + Shift + F
En macOS puede variar según la configuración del teclado.
Error 6: ejecutar la clase equivocada
A veces tenemos varias clases en el proyecto y ejecutamos una clase que no es la que queremos probar.
Por ejemplo, tenemos:
HolaMundo.java FichaAlumno.java Prueba.java
Si estamos editando FichaAlumno.java, pero Eclipse ejecuta HolaMundo.java, veremos una salida que no corresponde con el código que acabamos de cambiar.
Para evitarlo, hacemos clic derecho sobre la clase que queremos ejecutar:
Run As > Java Application
Así nos aseguramos de ejecutar el archivo correcto.
Error 7: no tener método main
Código:
public class HolaMundo {
System.out.println("Hola Mundo");
}
Este código es incorrecto porque la instrucción está directamente dentro de la clase, pero no dentro del método main.
Código correcto:
public class HolaMundo {
public static void main(String[] args) { System.out.println("Hola Mundo"); }
}
En estos primeros programas, las instrucciones deben estar dentro del método main.
9. Ejercicios propuestos
Ejercicio 1: primer mensaje
Crea un proyecto llamado:
EjerciciosPrimerosPasos
Dentro del proyecto, crea una clase llamada:
Ejercicio01
El programa debe mostrar por pantalla:
Estoy aprendiendo Java con Eclipse
Solución orientativa:
public class Ejercicio01 {
public static void main(String[] args) { System.out.println("Estoy aprendiendo Java con Eclipse"); }
}
Ejercicio 2: ficha personal
Crea una clase llamada:
Ejercicio02
El programa debe mostrar una ficha con tu nombre, curso y lenguaje que estás aprendiendo.
Ejemplo de salida:
Nombre: Laura Curso: Programación Lenguaje: Java Editor: Eclipse
public static void main(String[] args) { System.out.print("Hola "); System.out.print("Java"); System.out.println(); System.out.println("Fin del programa"); }
}
Salida esperada:
Hola Java Fin del programa
Observa que print no cambia de línea, mientras que println sí lo hace.
Ejercicio 5: provocando errores
Crea una clase llamada:
Ejercicio05
Escribe el programa Hola Mundo, pero provoca intencionadamente estos errores de uno en uno:
Quita el punto y coma.
Cambia System por system.
Quita una comilla.
Borra una llave.
Cambia el nombre de la clase.
Después observa qué error muestra Eclipse y corrígelo.
Este ejercicio es importante porque ayuda a perder el miedo a los errores. Un programador no es alguien que nunca se equivoca. Un programador es alguien que aprende a leer, entender y corregir errores.
10. Resumen del tema
En este tema hemos preparado el entorno básico para empezar a programar con Java. Hemos instalado el JDK, que contiene las herramientas necesarias para compilar y ejecutar programas Java. También hemos instalado Eclipse, que será nuestro entorno de desarrollo durante el curso.
Después hemos configurado el workspace, revisado el JDK dentro de Eclipse, activado opciones útiles como la codificación UTF-8 y los números de línea, y hemos creado nuestro primer proyecto Java.
También hemos visto la estructura mínima de un programa Java: una clase, el método main y una o varias instrucciones. Con el programa Hola Mundo hemos comprobado que todo funciona correctamente.
Por último, hemos repasado errores básicos muy habituales: olvidar el punto y coma, escribir mal las mayúsculas, borrar llaves, no poner comillas o ejecutar la clase equivocada.
A partir de aquí ya podemos empezar a trabajar con los primeros conceptos de programación: variables, tipos de datos, operadores, entrada de datos y estructuras de control.
En esta práctica vamos a crear un entorno de desarrollo web usando Docker. El objetivo es tener un sistema parecido a XAMPP o MAMP, pero más profesional, portable y fácil de reconstruir.
El entorno permitirá trabajar con:
Apache
PHP
Extensiones comunes de PHP
MySQL
phpMyAdmin
Mailpit para probar correos
Redis como servicio adicional opcional
Una carpeta local donde guardaremos todos nuestros proyectos web
Todos los contenedores tendrán el prefijo:
DEV_
De esta forma podremos identificarlos fácilmente dentro de Docker.
El alumno podrá crear una carpeta con un proyecto PHP y verlo desde el navegador.
Por ejemplo:
http://localhost:8080/pruebas/
2. Requisitos previos
Cada alumno necesitará:
Un ordenador con Windows, Ubuntu o macOS.
Docker instalado.
Un editor de código, por ejemplo VS Code.
Terminal o consola.
Navegador web.
Docker Compose se usará para definir y levantar varios contenedores a la vez. Docker lo describe como una herramienta para definir y ejecutar aplicaciones multicontenedor.
3. Instalación de Docker en Windows
En Windows se recomienda usar Docker Desktop.
Docker Desktop para Windows incluye Docker Engine, Docker CLI y Docker Compose. La documentación oficial indica que Docker Desktop puede usar WSL 2 como motor de ejecución en Windows.
Pasos recomendados
Instalar o activar WSL 2.
Instalar Docker Desktop para Windows.
Reiniciar el equipo si lo solicita.
Abrir Docker Desktop.
Comprobar que Docker está funcionando.
Desde PowerShell o Terminal de Windows:
docker --version docker compose version
Si ambos comandos responden con una versión, Docker está funcionando correctamente.
Carpeta recomendada en Windows
Para evitar problemas con permisos o sincronización, se recomienda crear la carpeta directamente en C:\.
mkdir C:\DEVLOCAL
No es recomendable usar carpetas dentro de OneDrive para este tipo de práctica.
4. Instalación de Docker en Ubuntu
En Ubuntu se puede instalar Docker Engine directamente desde los repositorios oficiales de Docker. La documentación oficial recomienda configurar primero el repositorio apt de Docker y después instalar Docker Engine y sus plugins.
Después de este comando, el alumno debe cerrar sesión y volver a entrar.
Carpeta recomendada en Ubuntu
mkdir -p ~/DEVLOCAL
5. Instalación de Docker en macOS
En macOS se recomienda instalar Docker Desktop para Mac. La documentación oficial diferencia entre Mac con chip Intel y Mac con Apple Silicon, por lo que hay que descargar la versión adecuada.
Pasos recomendados
Descargar Docker Desktop para Mac.
Elegir la versión correcta:
Mac Intel.
Mac Apple Silicon.
Instalar la aplicación.
Abrir Docker Desktop.
Esperar a que Docker arranque completamente.
Comprobar desde Terminal:
docker --version docker compose version
Carpeta recomendada en macOS
En el caso de este ejemplo usaremos:
/Users/antoniooteroveiga/DEVLOCAL
Para otro usuario sería algo similar a:
/Users/nombre_usuario/DEVLOCAL
6. Crear la estructura del proyecto
La estructura será la misma en Windows, Ubuntu y macOS.
if ($conexion->connect_error) { die("Error de conexión: " . $conexion->connect_error); }
echo "<h1>Conexión correcta con MySQL</h1>"; echo "<p>La base de datos devdb está disponible.</p>";
$conexion->close();
Abrimos en el navegador:
http://localhost:8080/pruebas/mysql.php
Si todo está correcto, veremos un mensaje confirmando la conexión.
17. Probar envío de correo con Mailpit
Creamos el archivo:
DEVLOCAL/pruebas/mail.php
Contenido:
<?php
$destino = "alumno@example.test"; $asunto = "Prueba desde PHP"; $mensaje = "Este correo ha sido enviado desde PHP y capturado por Mailpit."; $cabeceras = "From: devlocal@example.test";
if (mail($destino, $asunto, $mensaje, $cabeceras)) { echo "<h1>Correo enviado correctamente</h1>"; echo "<p>Abre Mailpit para verlo.</p>"; } else { echo "<h1>Error al enviar el correo</h1>"; }
$nombre = "Alumno"; $curso = "Desarrollo Web con PHP";
echo "<h1>Hola, $nombre</h1>"; echo "<p>Estamos trabajando en el curso de $curso.</p>";
Abrir:
http://localhost:8080/alumno_php/
Parte 2: Comprobar MySQL
Crear un archivo:
conexion.php
Contenido:
<?php
$conexion = new mysqli("mysql", "devuser", "devpass", "devdb");
if ($conexion->connect_error) { die("Error: " . $conexion->connect_error); }
echo "Conexión correcta con MySQL";
Abrir:
http://localhost:8080/alumno_php/conexion.php
Parte 3: Crear una tabla desde phpMyAdmin
Entrar en:
http://localhost:8081
Seleccionar la base de datos:
devdb
Crear una tabla llamada:
alumnos
Con estos campos:
Campo
Tipo
Extra
id
INT
AUTO_INCREMENT, PRIMARY KEY
nombre
VARCHAR(100)
email
VARCHAR(150)
fecha_alta
DATETIME
SQL:
CREATE TABLE alumnos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL, fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP );
¿Qué diferencia hay entre instalar Apache, PHP y MySQL directamente en el sistema y hacerlo con Docker?
¿Qué ventaja tiene que todos los servicios estén definidos en un archivo docker-compose.yml?
¿Por qué PHP se conecta a MySQL usando el host mysql y no localhost?
¿Qué es un volumen en Docker?
¿Dónde se guardan los datos de MySQL en este proyecto?
¿Qué pasaría si ejecutamos docker compose down -v?
¿Para qué sirve phpMyAdmin?
¿Para qué sirve Mailpit?
¿Por qué no deberíamos usar contraseñas como root o devpass en producción?
¿Qué diferencia hay entre un entorno de desarrollo y un entorno de producción?
25. Problemas frecuentes
Docker no arranca en Windows
Posibles causas:
Docker Desktop no está abierto.
WSL 2 no está instalado o activado.
La virtualización está desactivada en BIOS/UEFI.
El equipo necesita reiniciarse.
Docker recomienda usar el backend WSL 2 en Windows para Docker Desktop.
El puerto 8080 ya está ocupado
Puede ocurrir si otro servicio ya está usando ese puerto.
Solución: cambiar en docker-compose.yml:
ports: - "8080:80"
Por ejemplo:
ports: - "8090:80"
Después habría que entrar por:
http://localhost:8090
El puerto 3307 ya está ocupado
Cambiar:
ports: - "3307:3306"
Por ejemplo:
ports: - "3308:3306"
No aparecen los cambios en PHP
Probar a recargar el navegador con:
Ctrl + F5
También se puede reiniciar el contenedor:
docker compose restart apache_php
Error de permisos en Ubuntu
Si Docker pide sudo, puede faltar añadir el usuario al grupo docker.
sudo usermod -aG docker $USER
Después hay que cerrar sesión y volver a entrar.
phpMyAdmin no conecta
Comprobar que MySQL está activo:
docker ps
También se pueden ver los logs:
docker compose logs -f mysql
26. Cómo borrar todo y empezar de nuevo
Para parar los contenedores:
docker compose down
Para parar y borrar también los datos de MySQL:
docker compose down -v
Cuidado: este comando borra el volumen de MySQL. Si hay bases de datos creadas, se perderán.
29. Ampliaciones posibles
Cuando el entorno básico funcione, se pueden añadir mejoras:
Crear dominios locales como tienda.localhost.
Añadir HTTPS local.
Añadir un contenedor de Node.js.
Añadir un contenedor específico para Laravel.
Crear plantillas para WordPress.
Añadir copias de seguridad automáticas de MySQL.
Crear un script para exportar e importar bases de datos.
Crear varios entornos: desarrollo, pruebas y producción.
30. Conclusión
Con esta práctica hemos creado un entorno de desarrollo web completo usando Docker. El resultado es similar a XAMPP o MAMP, pero con una ventaja importante: todo el entorno queda definido mediante archivos.
Esto permite:
Repetir la instalación en diferentes sistemas operativos.
Compartir el entorno con otros compañeros.
Evitar conflictos con instalaciones locales.
Trabajar con varios servicios a la vez.
Preparar al alumno para entornos profesionales basados en contenedores.
Docker Compose facilita levantar todos los servicios con un solo comando, lo que lo convierte en una herramienta especialmente útil para desarrollo web moderno.
Script Cerrar
Además del script inicio, vamos a crear un script llamado cerrar. Este script no solamente permite apagar el entorno, sino también eliminarlo de diferentes formas según lo que necesitemos. Esto es importante porque no siempre queremos borrar los datos. A veces solo queremos detener los contenedores, y otras veces queremos empezar desde cero.
Diferencia entre las opciones
Opción
Comando
¿Borra contenedores?
¿Borra datos MySQL?
¿Borra imágenes?
Parar
docker compose stop
No
No
No
Eliminar contenedores
docker compose down
Sí
No
No
Eliminar con volúmenes
docker compose down -v
Sí
Sí
No
Destruir completo
docker compose down -v --rmi local
Sí
Sí
Sí
docker compose stop
Detiene los contenedores, pero no los elimina.
Es como apagar una máquina virtual.
docker compose down
Detiene y elimina los contenedores, pero mantiene los volúmenes.
Es decir, si teníamos una base de datos MySQL con datos, normalmente se conservará.
docker compose down -v
Detiene y elimina los contenedores, y también borra los volúmenes.
En este proyecto significa que se borrarán los datos de MySQL.
docker compose down -v --rmi local
Además de eliminar contenedores y volúmenes, elimina imágenes locales creadas por el proyecto.
En nuestro caso, puede borrar la imagen personalizada de Apache + PHP, por lo que en el siguiente arranque habrá que reconstruirla con:
docker compose up -d --build
Recomendación para uso diario
Para el día a día, lo normal es usar la opción:
1) Parar contenedores
o:
2) Parar y eliminar contenedores
La opción 3 y 4 solo deberían usarse cuando queramos empezar desde cero.
2) echo "Parando y eliminando contenedores..." docker compose down echo "" echo "Contenedores eliminados. Los volumenes se conservan." ;;
3) echo "ATENCION: esta opcion borrara los volumenes." echo "Esto eliminara los datos persistentes de MySQL." echo "" read -p "Escribe BORRAR para confirmar: " confirmacion
if [ "$confirmacion" = "BORRAR" ]; then echo "" echo "Eliminando contenedores y volumenes..." docker compose down -v echo "" echo "Entorno eliminado con volumenes." else echo "" echo "Operacion cancelada. No se ha borrado nada." fi ;;
4) echo "ATENCION: esta opcion borrara contenedores, volumenes e imagenes locales." echo "Esto eliminara los datos de MySQL y obligara a reconstruir la imagen PHP." echo "" read -p "Escribe DESTRUIR para confirmar: " confirmacion
if [ "$confirmacion" = "DESTRUIR" ]; then echo "" echo "Eliminando contenedores, volumenes e imagenes locales..." docker compose down -v --rmi local echo "" echo "Entorno destruido." else echo "" echo "Operacion cancelada. No se ha borrado nada." fi ;;
cd /Users/antoniooteroveiga/DEVLOCAL/_docker ./cerrar.sh
Versión más portable
Si quieres que funcione sin depender de tu usuario concreto, es mejor decirles que creen el archivo dentro de _docker y que lo ejecuten desde ahí.
cd ~/DEVLOCAL/_docker nano cerrar.sh chmod +x cerrar.sh ./cerrar.sh
El script ya detecta automáticamente la carpeta donde está, gracias a esta línea:
DEV_PATH="$(cd "$(dirname "$0")" && pwd)"
Por eso vale tanto para Ubuntu como para macOS.
Script para Windows: cerrar.bat
Crear el archivo:
C:\DEVLOCAL\_docker\cerrar.bat
Contenido:
@echo off cls
cd /d "%~dp0"
:menu cls echo ============================================== echo CERRAR ENTORNO DEVLOCAL echo ============================================== echo. echo Este script permite cerrar o destruir el entorno Docker DEV. echo. echo Elige una opcion: echo. echo 1) Parar contenedores echo Equivale a: docker compose stop echo. echo 2) Parar y eliminar contenedores echo Equivale a: docker compose down echo. echo 3) Parar, eliminar contenedores y borrar volumenes echo Equivale a: docker compose down -v echo AVISO: se borraran las bases de datos de MySQL. echo. echo 4) Parar, eliminar contenedores, volumenes e imagenes del proyecto echo Equivale a: docker compose down -v --rmi local echo AVISO: se borraran las bases de datos y las imagenes creadas localmente. echo. echo 5) Ver contenedores DEV activos echo. echo 6) Cancelar echo.
set /p opcion=Selecciona una opcion [1-6]:
if "%opcion%"=="1" goto parar if "%opcion%"=="2" goto eliminar if "%opcion%"=="3" goto volumenes if "%opcion%"=="4" goto destruir if "%opcion%"=="5" goto ver if "%opcion%"=="6" goto cancelar
:eliminar cls echo Parando y eliminando contenedores... echo. docker compose down echo. echo Contenedores eliminados. Los volumenes se conservan. pause goto fin
:volumenes cls echo ATENCION: esta opcion borrara los volumenes. echo Esto eliminara los datos persistentes de MySQL. echo. set /p confirmacion=Escribe BORRAR para confirmar:
if "%confirmacion%"=="BORRAR" ( echo. echo Eliminando contenedores y volumenes... docker compose down -v echo. echo Entorno eliminado con volumenes. ) else ( echo. echo Operacion cancelada. No se ha borrado nada. )
pause goto fin
:destruir cls echo ATENCION: esta opcion borrara contenedores, volumenes e imagenes locales. echo Esto eliminara los datos de MySQL y obligara a reconstruir la imagen PHP. echo. set /p confirmacion=Escribe DESTRUIR para confirmar:
if "%confirmacion%"=="DESTRUIR" ( echo. echo Eliminando contenedores, volumenes e imagenes locales... docker compose down -v --rmi local echo. echo Entorno destruido. ) else ( echo. echo Operacion cancelada. No se ha borrado nada. )
pause goto fin
:ver cls echo Mostrando contenedores DEV... echo. docker ps -a --filter "name=DEV_" echo. pause goto menu
:cancelar cls echo Operacion cancelada. pause goto fin
:fin cls echo ============================================== echo PROCESO FINALIZADO echo ============================================== echo.
En este proyecto vamos a montar un pequeño laboratorio retro usando DOSBox, una herramienta que nos permite ejecutar programas y juegos antiguos de MS-DOS en ordenadores modernos.
El objetivo no es solamente “abrir un juego antiguo”, sino aprender cómo funcionaba un entorno DOS:
Unidades como C: o D:.
Carpetas y rutas.
Archivos ejecutables .EXE, .COM y .BAT.
Montaje de carpetas como discos duros.
Montaje de imágenes ISO como CD-ROM.
Configuración del teclado.
Configuración del sonido.
Ajustes de velocidad.
Automatización con la sección [autoexec].
Uso y modificación del archivo dosbox.conf.
La práctica está planteada como una misión técnica. Cada alumno deberá preparar su propio entorno, probar programas, documentar los comandos utilizados y entregar evidencias.
Parte 1 — Preparación del laboratorio
2. Crear la carpeta principal de trabajo
Antes de abrir DOSBox vamos a crear una carpeta en nuestro ordenador. Esta carpeta será nuestro “disco duro virtual” dentro de DOSBox.
[autoexec]
keyb sp
mount c c:\doslab
c:
cd JUEGOS
cd JUEGO1
juego
En Linux/macOS:
[autoexec]
keyb sp
mount c ~/DOSLAB
c:
cd JUEGOS
cd JUEGO1
juego
84. Arrancar DOSBox con un archivo de configuración concreto
Windows
Desde PowerShell o CMD:
dosbox -conf C:\DOSLAB\CONFIG\dosbox_juego1.conf
Si el comando dosbox no funciona directamente, habrá que usar la ruta completa del ejecutable o crear un acceso directo.
Linux
dosbox -conf ~/DOSLAB/CONFIG/dosbox_juego1.conf
macOS
dosbox -conf ~/DOSLAB/CONFIG/dosbox_juego1.conf
85. Actividad 13 — Perfil personalizado
Crea dos archivos de configuración:
dosbox_basico.conf
dosbox_juego1.conf
El primero debe arrancar en C:\.
El segundo debe arrancar directamente dentro de la carpeta de un juego.
Preguntas
¿Qué ventaja tiene usar varios archivos .conf?
¿Qué diferencia hay entre tus dos configuraciones?
¿Cuál usarías para una práctica general?
¿Cuál usarías para abrir directamente un juego?
Parte 17 — Crear archivos BAT dentro de DOSBox
86. Qué es un archivo BAT
Un archivo .BAT contiene comandos que se ejecutan en orden.
Sirve para automatizar tareas dentro de DOS.
Por ejemplo, podemos crear un archivo llamado:
MENU.BAT
87. Crear un BAT desde DOSBox
Entra en C:
c:
Crea un archivo:
copy con menu.bat
Escribe:
@echo off
cls
echo ==========================
echo MENU DOSBOX
echo ==========================
echo.
echo 1. Ir a juegos
echo 2. Ir a programas
echo.
echo Escribe cd JUEGOS para entrar en juegos
echo Escribe cd PROGRAMAS para entrar en programas
Termina con:
Ctrl + Z
Enter
Ejecuta:
menu
88. Crear un lanzador para un juego
Supongamos que queremos crear un lanzador llamado juego1.bat.
copy con juego1.bat
Contenido:
@echo off
cls
cd \JUEGOS\JUEGO1
JUEGO.EXE
cd \
Termina con:
Ctrl + Z
Enter
Ejecuta:
juego1
89. Actividad 14 — Crear lanzadores
Crea al menos dos archivos .BAT:
Uno que muestre un menú.
Uno que arranque un juego o programa.
Preguntas
¿Para qué sirve un archivo .BAT?
¿Qué significa @echo off?
¿Qué ventaja tiene crear lanzadores?
¿Dónde has guardado tus archivos .BAT?
Parte 18 — Capturas de pantalla
90. Capturas desde DOSBox
En muchas versiones de DOSBox se pueden hacer capturas con:
Ctrl + F5
Las capturas se guardan en la carpeta configurada para capturas, dependiendo de la versión y sistema.
Si no funciona, puedes usar las herramientas del sistema operativo:
Windows
Win + Shift + S
macOS
Cmd + Shift + 4
Linux
Depende del entorno, pero suele funcionar:
Impr Pant
O herramientas como Flameshot.
91. Actividad 15 — Evidencias
Realiza capturas de:
DOSBox recién abierto.
Unidad C: montada.
Contenido de DOSLAB.
Imagen ISO montada como D:.
Juego o programa funcionando.
Archivo dosbox.conf editado.
Sección [autoexec].
Parte 19 — Comandos rápidos de DOSBox
92. Comandos internos útiles
Acción
Comando
Montar carpeta como C:
mount c ruta
Desmontar unidad
mount -u c
Montar ISO
imgmount d archivo.iso -t iso
Cambiar a C:
c:
Cambiar a D:
d:
Ver archivos
dir
Entrar en carpeta
cd carpeta
Volver atrás
cd ..
Ir a raíz
cd \
Limpiar pantalla
cls
Crear carpeta
md carpeta
Borrar carpeta vacía
rd carpeta
Borrar archivo
del archivo
Ver texto
type archivo.txt
Buscar EXE
dir *.exe
Buscar BAT
dir *.bat
Buscar COM
dir *.com
Cambiar teclado
keyb sp
Salir de DOSBox
exit
93. Atajos útiles
Acción
Atajo
Pantalla completa
Alt + Enter
Capturar/liberar ratón
Ctrl + F10
Bajar ciclos
Ctrl + F11
Subir ciclos
Ctrl + F12
Captura de pantalla
Ctrl + F5
Cambiar disco en imágenes múltiples
Ctrl + F4
Parte 20 — Configuración completa recomendada
94. Ejemplo de dosbox.conf básico para clase
Este ejemplo no incluye todo el archivo, solo las partes más importantes que conviene revisar.
[sdl]
fullscreen=false
fullresolution=desktop
windowresolution=1280x960
output=surface
autolock=true
sensitivity=100
[dosbox]
machine=svga_s3
memsize=16
[cpu]
core=auto
cputype=auto
cycles=auto
cycleup=10
cycledown=20
[sblaster]
sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
mixer=true
oplmode=auto
oplemu=default
oplrate=44100
[autoexec]
keyb sp
mount c c:\doslab
c:
cls
echo ================================
echo LABORATORIO DOSBOX
echo ================================
echo.
echo Unidad C: montada correctamente.
echo Usa DIR para ver archivos.
echo Usa CD JUEGOS para entrar en juegos.
echo.
dir
Para Linux/macOS, cambia esta línea:
mount c c:\doslab
por:
mount c ~/DOSLAB
Parte 21 — Configuración para juego con CD-ROM
95. Ejemplo Windows
[sdl]
fullscreen=false
fullresolution=desktop
windowresolution=1280x960
output=surface
autolock=true
sensitivity=100
[dosbox]
machine=svga_s3
memsize=16
[cpu]
core=auto
cputype=auto
cycles=12000
cycleup=10
cycledown=20
[sblaster]
sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
mixer=true
oplmode=auto
oplemu=default
oplrate=44100
[autoexec]
keyb sp
mount c c:\doslab
imgmount d c:\doslab\isos\juegocd.iso -t iso
c:
cd JUEGOS
cd JUEGOCD
cls
echo Juego con CD-ROM preparado
juego
96. Ejemplo Linux/macOS
[sdl]
fullscreen=false
fullresolution=desktop
windowresolution=1280x960
output=surface
autolock=true
sensitivity=100
[dosbox]
machine=svga_s3
memsize=16
[cpu]
core=auto
cputype=auto
cycles=12000
cycleup=10
cycledown=20
[sblaster]
sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
mixer=true
oplmode=auto
oplemu=default
oplrate=44100
[autoexec]
keyb sp
mount c ~/DOSLAB
imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso
c:
cd JUEGOS
cd JUEGOCD
cls
echo Juego con CD-ROM preparado
juego
Parte 22 — Solución de problemas
97. Error: Directory does not exist
Significa que la carpeta indicada no existe o la ruta está mal escrita.
Ejemplo incorrecto:
mount c c:\doslabb
Ejemplo correcto:
mount c c:\doslab
Comprueba desde tu sistema operativo que la carpeta existe.
98. Error: Drive C already mounted
La unidad C: ya está montada.
Puedes desmontarla:
mount -u c
Y volver a montarla:
mount c c:\doslab
99. No encuentro el juego
Usa:
dir
cd JUEGOS
dir
Busca ejecutables:
dir *.exe
dir *.bat
dir *.com
100. El juego pide CD
Monta la ISO:
imgmount d c:\doslab\isos\juegocd.iso -t iso
O en Linux/macOS:
imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso
101. El juego va muy rápido
Reduce ciclos:
Ctrl + F11
O cambia en dosbox.conf:
cycles=3000
102. El juego va muy lento
Aumenta ciclos:
Ctrl + F12
O cambia:
cycles=12000
103. No funciona el sonido
Ejecuta el configurador del juego:
setup
O:
install
Busca:
dir *.exe
Configura:
Sound Blaster 16
Port 220
IRQ 7
DMA 1
HDMA 5
104. No funciona el ratón
Captura el ratón:
Ctrl + F10
Comprueba también si el juego tiene opción de ratón.
105. El teclado escribe símbolos raros
Prueba:
keyb sp
O:
keyb es
Añádelo después en [autoexec].
Parte 23 — Entrega final del alumno
106. Documento que debe entregar el alumno
El alumno deberá entregar un documento con:
Portada.
Sistema operativo usado.
Versión de DOSBox usada.
Captura de la estructura de carpetas.
Comandos usados para montar C:.
Comandos usados para montar D: o ISO.
Captura del juego o programa funcionando.
Explicación de la configuración de sonido.
Explicación de la configuración de ciclos.
Captura del archivo dosbox.conf.
Captura de la sección [autoexec].
Problemas encontrados.
Soluciones aplicadas.
Conclusión personal.
107. Tabla de comandos usados
El alumno debe completar esta tabla:
Acción
Comando usado
Resultado
Montar unidad C:
Cambiar a C:
Ver archivos
Entrar en carpeta
Buscar ejecutables
Ejecutar programa
Montar ISO
Cambiar a D:
Configurar teclado
Cambiar ciclos
Pantalla completa
Capturar ratón
Parte 24 — Reto final
108. Reto: Museo DOSBox
Cada alumno o grupo deberá preparar un pequeño museo retro con tres elementos:
Un juego.
Un programa de utilidad.
Un programa educativo, demo o herramienta técnica.
Para cada elemento deberá indicar:
Campo
Información
Nombre
Tipo
Año aproximado
Carpeta
Ejecutable principal
Comandos de arranque
¿Necesita CD-ROM?
¿Necesita sonido?
Configuración usada
Problemas encontrados
Solución aplicada
Captura
Parte 25 — Conclusión
DOSBox nos permite aprender mucho más que a ejecutar juegos antiguos.
Con esta práctica hemos trabajado conceptos muy importantes:
Sistemas operativos antiguos.
Línea de comandos.
Rutas y unidades.
Montaje de discos.
Imágenes ISO.
Configuración de hardware emulado.
Sonido.
Ratón.
Teclado.
Automatización de arranque.
Documentación técnica.
Este proyecto nos ayuda a entender mejor cómo ha evolucionado la informática y por qué muchos conceptos antiguos siguen presentes en los sistemas actuales.
Tabla resumen de comandos principales de DOSBox
Categoría
Acción
Comando / Atajo
Ejemplo
Explicación
Unidades
Montar una carpeta como disco duro
mount c ruta
mount c c:\doslab
Convierte una carpeta real en la unidad C: dentro de DOSBox
Unidades
Montar carpeta en Linux/macOS
mount c ruta
mount c ~/DOSLAB
Monta una carpeta del usuario como unidad C:
Unidades
Cambiar a unidad C:
c:
c:
Entra en la unidad C:
Unidades
Cambiar a unidad D:
d:
d:
Entra en la unidad D:, normalmente usada como CD-ROM
Unidades
Cambiar a unidad Z:
z:
z:
Vuelve a la unidad interna de DOSBox
Unidades
Ver unidades montadas
mount
mount
Muestra información de las unidades montadas
Unidades
Desmontar una unidad
mount -u letra
mount -u c
Desmonta la unidad indicada
CD-ROM / ISO
Montar una ISO como CD-ROM
imgmount d archivo.iso -t iso
imgmount d c:\doslab\isos\juego.iso -t iso
Monta una imagen ISO como unidad D:
CD-ROM / ISO
Montar una carpeta como CD-ROM
mount d ruta -t cdrom
mount d c:\doslab\cdrom -t cdrom
Hace que una carpeta funcione como un CD-ROM
CD-ROM / ISO
Montar varias ISOs
imgmount d iso1 iso2 -t iso
imgmount d cd1.iso cd2.iso -t iso
Permite montar varios CDs para juegos con varios discos
CD-ROM / ISO
Cambiar de CD montado
Ctrl + F4
Ctrl + F4
Cambia entre imágenes montadas en la misma unidad
Navegación
Ver contenido de carpeta
dir
dir
Lista archivos y carpetas
Navegación
Entrar en una carpeta
cd carpeta
cd JUEGOS
Cambia a una carpeta concreta
Navegación
Volver a la carpeta anterior
cd ..
cd ..
Sube un nivel en la estructura de carpetas
Navegación
Ir a la raíz de la unidad
cd \
cd \
Vuelve al inicio de la unidad actual
Navegación
Limpiar pantalla
cls
cls
Borra el contenido visible de la pantalla
Carpetas
Crear carpeta
md nombre
md PRUEBA
Crea una carpeta
Carpetas
Borrar carpeta vacía
rd nombre
rd PRUEBA
Elimina una carpeta si está vacía
Archivos
Copiar archivo
copy origen destino
copy nota.txt copia.txt
Copia un archivo
Archivos
Borrar archivo
del archivo
del nota.txt
Elimina un archivo
Archivos
Renombrar archivo
ren antiguo nuevo
ren viejo.txt nuevo.txt
Cambia el nombre de un archivo
Archivos
Ver archivo de texto
type archivo
type readme.txt
Muestra el contenido de un archivo de texto
Archivos
Crear archivo desde consola
copy con archivo.txt
copy con nota.txt
Permite crear un archivo escribiendo desde DOS
Archivos
Finalizar creación con copy con
Ctrl + Z y Enter
Ctrl + Z + Enter
Guarda el archivo creado con copy con
Ejecutables
Buscar archivos EXE
dir *.exe
dir *.exe
Muestra los ejecutables .EXE
Ejecutables
Buscar archivos BAT
dir *.bat
dir *.bat
Muestra scripts .BAT
Ejecutables
Buscar archivos COM
dir *.com
dir *.com
Muestra ejecutables .COM
Ejecutables
Ejecutar programa
nombre
juego
Ejecuta un archivo .EXE, .COM o .BAT
Configuración
Generar archivo de configuración
config -writeconf archivo.conf
config -writeconf c:\doslab\config\dosbox.conf
Crea un archivo de configuración de DOSBox
Configuración
Usar un archivo de configuración
dosbox -conf archivo.conf
dosbox -conf C:\DOSLAB\CONFIG\juego.conf
Arranca DOSBox usando una configuración concreta
Configuración
Configurar teclado español
keyb sp
keyb sp
Intenta activar distribución de teclado española
Configuración
Alternativa teclado español
keyb es
keyb es
Otra opción según versión de DOSBox
Pantalla
Cambiar pantalla completa / ventana
Alt + Enter
Alt + Enter
Alterna entre modo ventana y pantalla completa
Ratón
Capturar o liberar ratón
Ctrl + F10
Ctrl + F10
Hace que el ratón quede dentro o fuera de DOSBox
Velocidad
Reducir ciclos
Ctrl + F11
Ctrl + F11
Reduce la velocidad de la CPU emulada
Velocidad
Aumentar ciclos
Ctrl + F12
Ctrl + F12
Aumenta la velocidad de la CPU emulada
Capturas
Captura de pantalla
Ctrl + F5
Ctrl + F5
Guarda una captura, si la versión lo soporta
Salida
Salir de DOSBox
exit
exit
Cierra DOSBox
Ayuda
Ver ayuda básica
intro
intro
Muestra información introductoria de DOSBox
Ayuda
Ver ayuda de comandos
help
help
Muestra ayuda de comandos disponibles
Ayuda
Ayuda de un comando concreto
comando /?
mount /?
Muestra ayuda del comando indicado, si está disponible
Tabla rápida de configuraciones habituales en dosbox.conf
Sección
Opción
Ejemplo
Uso
[sdl]
fullscreen
fullscreen=false
Indica si DOSBox arranca en pantalla completa
[sdl]
fullresolution
fullresolution=desktop
Usa la resolución del escritorio en pantalla completa
En esta práctica vas a desplegar una pequeña infraestructura de servicios utilizando Docker y Docker Compose.
El objetivo no es únicamente “levantar contenedores”, sino comprender cómo se organizan los servicios, cómo se comunican entre ellos, cómo se almacenan los datos, cómo se exponen puertos al exterior y cómo se puede documentar y justificar una instalación técnica.
Durante la práctica se trabajará con servicios similares a los vistos en clase:
Servidor web HTTP con Apache.
PHP para ejecutar código dinámico.
MySQL como base de datos relacional.
phpMyAdmin como herramienta de administración.
MongoDB como base de datos NoSQL.
Mongo Express como herramienta de administración.
Redes Docker.
Volúmenes persistentes.
Variables de entorno.
Logs y comprobaciones.
Copias de seguridad básicas.
Documentación técnica.
2. Objetivos de aprendizaje
Al finalizar la práctica, el alumno deberá ser capaz de:
Explicar qué es Docker y para qué se utiliza.
Diferenciar una imagen de un contenedor.
Crear y ejecutar contenedores mediante Docker Compose.
Configurar servicios conectados entre sí.
Usar volúmenes para conservar datos.
Usar redes Docker para aislar servicios.
Configurar variables de entorno.
Desplegar una aplicación PHP conectada a MySQL.
Desplegar y consultar una base de datos MongoDB.
Comprobar el estado de los servicios mediante comandos.
Interpretar errores básicos mediante logs.
Documentar una instalación técnica de forma clara.
Defender oralmente el trabajo realizado.
3. Resultado final esperado
Al terminar la práctica deberás tener funcionando una infraestructura compuesta por varios contenedores:
Servicio
Tecnología
Puerto externo sugerido
Función
Web PHP
Apache + PHP
8080
Servidor web principal
MySQL
MySQL
3306 o solo interno
Base de datos relacional
phpMyAdmin
phpMyAdmin
8081
Administración de MySQL
MongoDB
MongoDB
27017 o solo interno
Base de datos NoSQL
Mongo Express
Mongo Express
8082
Administración de MongoDB
La aplicación PHP deberá mostrar una página web con información del alumno, conexión a MySQL y, opcionalmente, conexión a MongoDB.
4. Normas de entrega
El alumno deberá entregar:
Carpeta completa del proyecto.
Archivo docker-compose.yml.
Archivo .env.
Código fuente de la aplicación PHP.
Capturas de pantalla.
Documento de memoria en PDF.
Comandos utilizados.
Respuestas a las preguntas de reflexión.
Evidencias de funcionamiento.
Breve vídeo opcional de demostración.
5. Estructura recomendada del proyecto
Crea una carpeta llamada:
practica-docker-servicios-nombre-apellido
Dentro de ella deberás crear una estructura similar a esta:
¿Qué diferencia hay entre el puerto de la izquierda y el de la derecha en esta línea?
- "8080:80"
¿Para qué sirve volumes?
¿Qué pasaría con los datos de MySQL si no usásemos un volumen?
¿Qué hace depends_on?
¿Qué limitación tiene depends_on?
¿Para qué sirve definir una red propia llamada red_asir?
¿Por qué el servicio web puede conectarse a MySQL usando el nombre mysql?
10. Fase 5 — Script inicial de MySQL
Dentro de la carpeta mysql, crea el archivo init.sql.
Ejemplo:
CREATE TABLE IF NOT EXISTS alumnos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, apellido VARCHAR(100) NOT NULL, curso VARCHAR(100) NOT NULL, fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
¿Qué diferencia hay entre exportar e importar una base de datos?
¿Qué riesgos existen al restaurar una copia sobre una base de datos que ya contiene información?
¿Qué medidas tomarías antes de restaurar una copia en producción?
22. Fase 17 — Comprobación de red entre contenedores
Entra en el contenedor web:
docker exec -it asir_web_php bash
Instala herramientas de red si fuera necesario:
apt update apt install -y iputils-ping
Prueba conectividad:
ping mysql ping mongodb
Sal del contenedor:
exit
Preguntas de reflexión
¿Por qué podemos hacer ping mysql y no necesitamos conocer la IP del contenedor?
¿Qué papel hace el DNS interno de Docker?
¿Cambiaría la IP del contenedor si lo eliminamos y lo volvemos a crear?
¿Por qué es mejor usar nombres de servicio que direcciones IP?
23. Fase 18 — Seguridad básica
Analiza la configuración actual.
Responde:
¿Qué puertos están expuestos al equipo anfitrión?
¿Qué servicios son accesibles desde el navegador?
¿Tiene sentido exponer MySQL directamente al exterior?
¿Tiene sentido exponer MongoDB directamente al exterior?
¿Qué contraseñas son débiles?
¿Qué cambiarías si esto fuese un servidor real?
¿Qué riesgos tiene usar root para administrar la base de datos?
¿Qué riesgos tiene dejar herramientas como phpMyAdmin o Mongo Express accesibles públicamente?
Mejora obligatoria
Modifica el docker-compose.yml para que MySQL y MongoDB no publiquen puertos hacia el exterior.
Es decir, evita configuraciones como:
ports: - "3306:3306"
o:
ports: - "27017:27017"
Los servicios internos deben comunicarse por la red Docker, no necesariamente por puertos públicos.
Pregunta de reflexión
Si MySQL no tiene puerto publicado, ¿por qué phpMyAdmin puede seguir conectando con él?
24. Fase 19 — Personalización del proyecto
El alumno deberá personalizar la práctica.
Como mínimo deberá:
Cambiar el nombre de los contenedores.
Cambiar el nombre de la base de datos.
Cambiar usuario y contraseña.
Personalizar la página principal.
Insertar datos propios.
Añadir una nueva tabla en MySQL.
Añadir una nueva colección en MongoDB.
Documentar los cambios realizados.
Nueva tabla obligatoria
Crea una tabla llamada servicios.
Ejemplo:
CREATE TABLE IF NOT EXISTS servicios ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, imagen VARCHAR(100) NOT NULL, puerto VARCHAR(20), descripcion TEXT );
Inserta al menos cinco servicios:
Apache/PHP.
MySQL.
phpMyAdmin.
MongoDB.
Mongo Express.
Preguntas de reflexión
¿Qué campos has elegido para la tabla servicios?
¿Por qué has elegido esos campos?
¿Qué relación existe entre esta tabla y la infraestructura desplegada?
¿Cómo podrías mostrar esta tabla desde PHP?
25. Fase 20 — Ampliación opcional
Para subir nota, puedes realizar una o varias de estas mejoras.
Opción A — Añadir Nginx como proxy inverso
Añade un contenedor Nginx que actúe como punto de entrada.
Debe permitir acceder a la aplicación PHP desde otro puerto o ruta.
Opción B — Añadir Adminer
Añade Adminer como alternativa a phpMyAdmin.
Opción C — Añadir Redis
Añade Redis como servicio adicional y explica para qué se utiliza.
Opción D — Crear una aplicación PHP más completa
La aplicación deberá permitir:
Insertar alumnos.
Listar alumnos.
Borrar alumnos.
Editar alumnos.
Opción E — Crear documentación técnica avanzada
Incluye:
Diagrama de red.
Tabla de servicios.
Tabla de puertos.
Tabla de volúmenes.
Tabla de variables de entorno.
Problemas encontrados.
Soluciones aplicadas.
26. Documento de memoria
El documento final debe tener la siguiente estructura:
Portada
Debe incluir:
Nombre del alumno.
Curso.
Módulo o asignatura.
Nombre de la práctica.
Fecha.
Profesor.
Índice
Debe estar generado o escrito de forma ordenada.
1. Introducción
Explica brevemente qué se ha hecho en la práctica.
2. Objetivos
Enumera los objetivos técnicos.
3. Herramientas utilizadas
Incluye:
Sistema operativo.
Docker.
Docker Compose.
Editor de código.
Navegador.
Terminal.
Otros programas usados.
4. Estructura del proyecto
Incluye la estructura de carpetas y explica para qué sirve cada una.
5. Explicación del docker-compose.yml
No basta con pegar el archivo.
Hay que explicar:
Servicios.
Imágenes.
Puertos.
Volúmenes.
Redes.
Variables de entorno.
Dependencias.
6. Desarrollo de la aplicación PHP
Explica:
Qué archivos has creado.
Cómo se conecta PHP con MySQL.
Cómo se insertan datos.
Cómo se muestran datos.
7. Trabajo con MySQL
Explica:
Base de datos creada.
Tablas.
Registros.
Acceso desde phpMyAdmin.
Copia de seguridad.
8. Trabajo con MongoDB
Explica:
Base de datos creada.
Colecciones.
Documentos.
Acceso desde Mongo Express.
9. Evidencias de funcionamiento
Incluye capturas claras y comentadas.
Cada captura debe tener una breve explicación.
10. Problemas encontrados
Incluye al menos tres problemas, aunque sean pequeños.
Ejemplos:
Error de puerto ocupado.
Error de conexión a MySQL.
Contenedor reiniciándose.
Variable mal escrita.
Volumen que no se reiniciaba.
Falta de extensión PHP.
Para cada problema indica:
Qué ocurrió.
Cómo lo detectaste.
Qué comando usaste.
Cómo lo solucionaste.
11. Preguntas de reflexión
Incluye todas las preguntas respondidas.
12. Conclusión
Explica qué has aprendido y qué mejorarías.
27. Defensa oral o presencial
Después de entregar la práctica, el alumno deberá defenderla.
La defensa puede ser online o presencial.
El alumno deberá ser capaz de:
Explicar la estructura del proyecto.
Abrir el docker-compose.yml y explicar cada servicio.
Levantar y detener los contenedores.
Mostrar la aplicación funcionando.
Enseñar phpMyAdmin y Mongo Express.
Explicar qué son los volúmenes.
Explicar qué son las redes.
Mostrar los logs de un contenedor.
Explicar cómo hizo la copia de seguridad.
Justificar los problemas encontrados y las soluciones aplicadas.
28. Preguntas posibles para la defensa
Estas preguntas se pueden usar para comprobar la autoría real del trabajo.
Docker básico
¿Qué es una imagen Docker?
¿Qué es un contenedor?
¿Qué diferencia hay entre imagen y contenedor?
¿Qué comando usas para ver contenedores activos?
¿Qué comando usas para ver imágenes descargadas?
¿Qué ocurre si borras un contenedor?
¿Qué ocurre si borras una imagen?
Docker Compose
¿Para qué sirve Docker Compose?
¿Qué archivo utiliza Docker Compose por defecto?
¿Qué hace docker compose up -d?
¿Qué hace docker compose down?
¿Qué hace docker compose down -v?
¿Qué diferencia hay entre image y build?
¿Para qué sirve depends_on?
Redes
¿Qué red has creado?
¿Por qué los contenedores pueden comunicarse usando nombres?
¿Qué diferencia hay entre una red interna Docker y la red de tu ordenador?
¿Por qué no es recomendable publicar todos los puertos?
Volúmenes
¿Qué volúmenes has creado?
¿Para qué sirve un volumen?
¿Dónde guarda MySQL sus datos dentro del contenedor?
¿Qué pasa si eliminas los volúmenes?
¿Cómo comprobarías que los datos persisten?
MySQL y PHP
¿Cómo se conecta PHP a MySQL?
¿Qué host usa PHP para conectarse a MySQL?
¿Por qué el host es mysql y no localhost?
¿Qué tabla has creado?
¿Qué consulta SQL has usado?
¿Qué es una consulta preparada?
¿Qué error te apareció con PHP y MySQL?
MongoDB
¿Qué diferencia hay entre MySQL y MongoDB?
¿Qué es una colección?
¿Qué es un documento?
¿Qué herramienta has usado para administrar MongoDB?
¿Qué documentos has insertado?
Seguridad
¿Qué contraseñas has utilizado?
¿Son contraseñas seguras?
¿Qué cambiarías en producción?
¿Expondrías phpMyAdmin a Internet?
¿Expondrías MongoDB a Internet?
Autoría
Enséñame el archivo que más te costó configurar.
Explícame un error concreto que hayas tenido.
Cambia ahora el puerto de la web al 8090.
Añade un nuevo registro a la base de datos.
Para los contenedores y vuelve a levantarlos.
Muéstrame los logs de MySQL.
Entra dentro del contenedor web.
Explica por qué tu aplicación sigue funcionando después de reiniciar los contenedores.
Borra un contenedor y vuelve a crearlo.
Explica qué parte del trabajo has entendido mejor y cuál peor.
29. Rúbrica de evaluación
Criterio
Peso
Estructura correcta del proyecto
10%
docker-compose.yml funcional y bien organizado
15%
Uso correcto de redes y volúmenes
10%
Despliegue funcional de Apache/PHP/MySQL/phpMyAdmin
15%
Despliegue funcional de MongoDB/Mongo Express
10%
Aplicación PHP conectada a MySQL
10%
Evidencias y capturas claras
10%
Respuestas de reflexión
10%
Seguridad básica y justificación técnica
5%
Defensa oral/presencial
15%
Total: 100%
30. Penalizaciones
Se podrán aplicar penalizaciones por:
Motivo
Penalización
No entrega de memoria
Suspenso
No funciona Docker Compose
Hasta -40%
No hay evidencias suficientes
Hasta -20%
No responde preguntas de reflexión
Hasta -20%
No sabe defender el trabajo
Hasta -50%
Copia evidente sin comprensión
Suspenso
Archivos desordenados o incompletos
Hasta -15%
Contraseñas o datos sensibles expuestos sin explicación
Hasta -10%
31. Entrega mínima para aprobar
Para aprobar la práctica es obligatorio:
Entregar el proyecto completo.
Levantar los servicios con Docker Compose.
Mostrar la web PHP funcionando.
Mostrar MySQL funcionando.
Mostrar phpMyAdmin funcionando.
Mostrar MongoDB o Mongo Express funcionando.
Usar al menos un volumen persistente.
Responder las preguntas principales.
Defender el trabajo oralmente.
32. Entrega excelente
Una entrega excelente incluirá:
Proyecto ordenado.
docker-compose.yml limpio y comentado.
Uso correcto de .env.
Aplicación PHP personalizada.
Inserción y listado de datos.
MySQL y MongoDB correctamente documentados.
Capturas claras.
Explicaciones propias.
Problemas reales documentados.
Defensa fluida y técnica.
Mejoras opcionales implementadas.
Buena presentación del PDF.
33. Conclusión para el alumno
Esta práctica no consiste únicamente en ejecutar comandos. El objetivo es que comprendas cómo se despliega una pequeña infraestructura de servicios usando contenedores.
Docker permite crear entornos reproducibles, rápidos de montar y fáciles de compartir. Docker Compose permite definir varios servicios en un único archivo y levantar toda la infraestructura con un solo comando.
Si has completado la práctica correctamente, habrás trabajado conceptos fundamentales para la administración de sistemas y el despliegue de aplicaciones modernas:
Servicios.
Contenedores.
Redes.
Puertos.
Volúmenes.
Bases de datos.
Aplicaciones web.
Seguridad básica.
Documentación técnica.
Resolución de problemas.
Esta práctica está bastante bien como práctica troncal de evaluación. Mi recomendación sería que no la valores solo por “si funciona”, sino por tres cosas: funcionamiento, memoria técnica y defensa. Ahí es donde realmente puedes detectar si el alumno lo ha hecho, lo ha entendido o simplemente lo ha copiado.
En el siguiente audio generado por IA podrás escuchar un texto de introducción al curso y resumen del contexto por el que vamos a empezar nuestro curso.
El desarrollo de aplicaciones web es una de las áreas más importantes dentro del mundo de la programación. Gran parte de los servicios que utilizamos a diario, como tiendas online, plataformas educativas, paneles de administración, sistemas de reservas, redes sociales o aplicaciones internas de empresa, funcionan sobre tecnologías web conectadas a bases de datos y servidores.
Este módilo está diseñado para aprender a crear aplicaciones web con PHP desde cero, empezando por los fundamentos del lenguaje y avanzando progresivamente hacia el desarrollo de proyectos completos, organizados, seguros y preparados para un entorno profesional.
A lo largo del viaje, el alumno aprenderá no solo a escribir código PHP, sino también a comprender cómo funciona una aplicación web real: cómo se reciben datos desde formularios, cómo se validan, cómo se almacenan en una base de datos, cómo se organiza el código mediante programación orientada a objetos, cómo se estructura una aplicación usando patrones como MVC y cómo se añaden funcionalidades modernas mediante JavaScript, AJAX, APIs y frameworks como Laravel.
El objetivo principal es que el alumno pase de crear pequeños scripts a desarrollar aplicaciones completas, con usuarios, sesiones, permisos, paneles de administración, conexión a bases de datos, seguridad, despliegue en servidor y buenas prácticas de mantenimiento.
El temario tendrá un enfoque eminentemente práctico. Cada bloque estará orientado a construir conocimiento paso a paso, combinando teoría, ejemplos guiados y proyectos reales. La idea no es memorizar instrucciones, sino entender cómo se diseña, se programa y se despliega una aplicación web desde el inicio hasta su puesta en producción.
Al finalizar el módulo, el alumno tendrá una visión completa del desarrollo web con PHP y será capaz de crear sus propias aplicaciones, mantener proyectos existentes y continuar aprendiendo tecnologías más avanzadas dentro del ecosistema PHP moderno.
Programa del módulo
Bloque 1 — Fundamentos de programación y entorno
Introducción al desarrollo web con PHP
Instalación del entorno de trabajo
Servidores web: Apache, Nginx y PHP integrado
Primeros scripts en PHP
Sintaxis básica de PHP
Variables, tipos de datos y operadores
Estructuras de control
Bucles y control de flujo
Funciones en PHP
Organización básica de archivos en un proyecto PHP
Bloque 2 — PHP aplicado a la web
Funcionamiento de HTTP
Formularios HTML y procesamiento con PHP
Métodos GET y POST
Validación de datos del usuario
Sanitización y filtrado de entradas
Manejo de errores y mensajes al usuario
Redirecciones y cabeceras HTTP
Inclusión de archivos y plantillas básicas
Gestión de rutas simples
Buenas prácticas iniciales en aplicaciones PHP
Bloque 3 — Programación orientada a objetos en PHP
Introducción a la programación orientada a objetos
Clases y objetos
Propiedades y métodos
Constructores y destructores
Encapsulación
Modificadores de acceso
Métodos estáticos
Constantes de clase
Herencia
Sobrescritura de métodos
Interfaces
Clases abstractas
Polimorfismo
Traits
Namespaces
Autoloading de clases
Organización de clases en un proyecto
Buenas prácticas de POO en PHP
Bloque 4 — Bases de datos con MySQL/MariaDB
Introducción a bases de datos relacionales
Diseño básico de bases de datos
Entidades, atributos y relaciones
Claves primarias y claves foráneas
Normalización básica
SQL esencial para aplicaciones web
Consultas SELECT
Inserción de datos
Actualización de registros
Eliminación de registros
Conexión de PHP con MySQL
MySQLi frente a PDO
Consultas preparadas
Control de errores en operaciones de base de datos
Bloque 5 — JavaScript, AJAX y PHP
Introducción a JavaScript para aplicaciones PHP
Manipulación básica del DOM
Eventos en JavaScript
Validación básica de formularios en cliente
Fetch API
Envío de datos asíncronos
Respuestas JSON desde PHP
Formularios sin recargar la página
Buscadores dinámicos
Validación combinada cliente-servidor
Tablas dinámicas
Gestión de errores en AJAX
Integración PHP, JavaScript y base de datos
Bloque 6 — Proyecto CRUD básico
Estructura de un CRUD en PHP
Listado de registros
Creación de registros
Edición de registros
Eliminación de registros
Validaciones en un CRUD
Mensajes de confirmación y error
Paginación de resultados
Búsqueda y filtrado
Organización del código del CRUD con clases
Mejora del CRUD con JavaScript y Fetch
Bloque 7 — Arquitectura de aplicaciones PHP
Separación de responsabilidades
Patrón MVC
Controladores
Modelos
Vistas
Sistema básico de rutas
Controlador frontal
Plantillas reutilizables
Configuración centralizada
Organización profesional de carpetas
Bloque 8 — Sesiones, usuarios y autenticación
Cookies en PHP
Sesiones en PHP
Registro de usuarios
Inicio de sesión
Cierre de sesión
Protección de páginas privadas
Roles y permisos
Hash seguro de contraseñas
Recordar usuario de forma segura
Recuperación de contraseña
Bloque 9 — Seguridad en aplicaciones PHP
Principales riesgos de seguridad web
Inyección SQL
Cross-Site Scripting
Cross-Site Request Forgery
Gestión segura de sesiones
Validación avanzada de entradas
Subida segura de archivos
Control de acceso
Protección de credenciales y configuración
Buenas prácticas OWASP aplicadas a PHP
Bloque 10 — Trabajo con archivos y recursos externos
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.