Unidad 2.3: Sintaxis de objetos en PHP
Objetivo:
Introducir a los alumnos en la programación orientada a objetos (POO) con PHP, cubriendo la sintaxis básica y cómo trabajar con clases, objetos, propiedades y métodos.
1. Introducción a la Programación Orientada a Objetos (POO) en PHP
- ¿Qué es la programación orientada a objetos?
- Ventajas de la POO en el desarrollo web.
- Explicación de los conceptos fundamentales:
- Clase: Plantilla o molde para crear objetos.
- Objeto: Instancia de una clase.
- Propiedad: Variable dentro de una clase.
- Método: Función dentro de una clase.
2. Sintaxis básica de objetos en PHP
2.1 Creación de una clase y un objeto
- Definición de una clase:
| Clase Persona | |
|---|---|
- Instanciación de un objeto de una clase:
| Instanciación de un objeto | |
|---|---|
2.2 Propiedades y métodos
- Propiedades: Atributos de una clase que describen el objeto.
- Métodos: Funciones definidas dentro de una clase.
Existen algunos métodos especiales en PHP que se llaman métodos mágicos. Estos métodos empiezan y terminan con dos guiones bajos __.
__construct(): Método constructor que se ejecuta al crear un objeto.__destruct(): Método destructor que se ejecuta al destruir un objeto.__toString(): Método para convertir un objeto a una cadena.
Un ejemplo de implmentación de un objeto con estos métodos mágicos sería:
Ejemplo de creación y uso de un objeto con métodos mágicos:
| Uso de la clase Persona | |
|---|---|
Clases abstractas e interfaces
- Clases abstractas: Son clases que no pueden ser instanciadas directamente, sino que se utilizan como plantillas para otras clases.
- Interfaces: Son como clases abstractas, pero solo contienen métodos sin implementación. Las clases que implementan una interfaz deben definir los métodos de la interfaz.
Para ello utilizaremos la palabra reservada abstract para las clases abstractas y interface para las interfaces. Las propiedades y métodos de una clase abstracta deben ser implementados en las clases que heredan de ella.
Ejemplo de uso de una clase abstracta e interfaz:
| Uso de la clase abstracta y la interfaz | |
|---|---|
¿Cómo saber si un objeto implementa una interfaz?
Para verificar si un objeto implementa una interfaz, se puede utilizar la función instanceof.
| Verificar si un objeto implementa una interfaz | |
|---|---|
Métodos y propiedades estáticas
- Métodos estáticos: Son métodos que se pueden llamar sin necesidad de instanciar un objeto.
- Propiedades estáticas: Son propiedades que pertenecen a la clase en lugar de a una instancia específica.
| Métodos y propiedades estáticas | |
|---|---|
2.3 Modificadores de acceso: public, private, protected
public: La propiedad o método es accesible desde cualquier parte del código.private: La propiedad o método solo es accesible dentro de la clase.protected: La propiedad o método es accesible dentro de la clase y sus subclases.
3. Herencia en PHP
3.1 ¿Qué es la herencia?
La herencia permite que una clase herede métodos y propiedades de otra clase. Esto ayuda a reutilizar el código y a mantener una estructura más organizada.
3.2 Métodos y propiedades heredadas
- Uso de
parent::para acceder a métodos y propiedades de la clase padre.
4. Creación de módulos PHP y su reutilización
1. ¿Qué es un módulo en PHP?
En PHP, un módulo es un fragmento de código que contiene una funcionalidad específica que puede ser importada o incluida en otros archivos. Los módulos son ideales para separar responsabilidades y reutilizar código en múltiples partes de la aplicación.
2. ¿Cómo crear y utilizar un módulo PHP?
2.1 Crear un módulo PHP
Para crear un módulo en PHP, simplemente se debe escribir el código en un archivo PHP independiente. Este archivo puede contener funciones, clases o variables que luego podrán ser utilizadas en otros archivos.
Ejemplo de un módulo para operaciones matemáticas:
| Módulo de operaciones | |
|---|---|
2.2 Importar un módulo en otro archivo
Para poder usar este módulo, necesitamos importarlo en el archivo donde vamos a utilizar las funciones que definimos. Para ello, usamos include, require, include_once o require_once.
include: Incluye el archivo y genera un aviso si no se encuentra.require: Incluye el archivo y genera un error fatal si no se encuentra.include_onceyrequire_onceson similares, pero aseguran que el archivo se incluya solo una vez.
Ejemplo de cómo importar y usar el módulo operaciones.php:
3. Buenas prácticas en la creación de módulos PHP
- Usar nombres descriptivos para los archivos y funciones.
- Dividir el código en módulos pequeños según funcionalidades (por ejemplo,
conexion_bd.php,validaciones.php,funciones_usuarios.php). - Utilizar funciones o clases para hacer el código reutilizable y evitar la repetición.
- Documentar los módulos y funciones para facilitar su uso en proyectos más grandes.
5. Ejercicios prácticos
Ejercicio 1: Crear una clase Coche
Enunciado: Crea una clase Coche con las propiedades marca y modelo, y un método detalles() que muestre los detalles del coche. Instancia un objeto de esa clase y muestra los detalles.
Solución
Ejercicio 2: Crear una clase CuentaBancaria
Enunciado: Crea una clase CuentaBancaria con las propiedades titular y saldo. La clase debe tener un método para ingresar dinero y otro para retirar. Crea una instancia de la clase, ingresa dinero, retíralo y muestra el saldo.
Solución
Ejercicio 3: Herencia en PHP
Enunciado: Crea una clase base Animal con un método hacerSonido(). Luego, crea una clase Perro que herede de Animal y sobrescriba el método hacerSonido() para que diga "¡Guau!". Instancia un objeto de Perro y llama al método hacerSonido().
Solución
Ejercicio 4: Uso de parent:: para acceder a métodos de la clase padre
Enunciado: Crea una clase base Vehiculo con un método detalles(). Luego, crea una clase Coche que herede de Vehiculo y sobrescriba el método detalles() para agregar más información. Usa parent::detalles() para incluir la información de la clase padre.
Solución
Ejercicio 5: Clases y objetos en PHP
Vamos a crear una jerarquía de clase, para ello utilizaremos los conceptos de clases, objetos, herencia, interfaces y clases abstractas en PHP. Crearemos una serie de clases que representan figuras geométricas y que implementan una interfaz para poder ser dibujadas.
Matemáticamente el cálculo de sis dos figuras se solapan pude ser complicado, aquí tenéis un ejemplo de cómo se puede hacer. En caso de que no queráis hacerlo, podéis añadir a Dibujable los métodos Trasladar y Rotar, que permitan mover y rotar la figura. Para la rotación pasaremos como parámetro el ángulo en grados, se rotará desde el punto (0,0) y se devolverá la figura rotada.
Enunciado 1: Crear la clase Color
Crear la clase Color
Enunciado: Crea una clase Color con tres propiedades: rojo, verde y azul. Los valores de estas propiedades deben estar entre 0 y 255. Implementa un constructor que inicialice estas propiedades y un método __toString que devuelva el color en formato RGB(255, 100, 50).
Solución
Enunciado 2: Crear la clase Punto
Crear la clase Punto
Enunciado: Crea una clase Punto con las propiedades x e y (entero) para poder ubicar un punto en un mapa 2D. Implementa un método distancia(Punto $punto) que calcule la distancia entre el punto actual y otro punto pasado como parámetro.
Solución
Enunciado 3: Crear las interfaces Dibujable y Medible
Crear la interfaz Dibujable
Enunciado: Crea una interfaz Dibujable con un método abstracto dibujar() que debe devolver el array de puntos de la figura para que puedan ser dibujados, junto con el color de fondo y borde.
Enunciado 4: Crear la clase Figura (abstracta)
Crear la clase Figura (abstracta)
Enunciado: Crea una clase abstracta Figura con una propiedad privada que almacene un array de objetos Punto (los vértices de la figura), y propiedades protejidas para el color de fondo y el color del borde. Implementa métodos abstractos como area(), perimetro(), y solapar(Figura $figura) para verificar si la figura solapa con otra figura. El método solapar debe devolver true si alguna de las figuras se solapan. Para acceder a los colores, utiliza getters y setters.
Solución
Enunciado 5: Crear la clase Cuadrado (heredando de Figura)
Crear la clase Cuadrado (heredando de Figura)
Enunciado: Crea la clase Cuadrado que herede de la clase Figura y que sobrescriba los métodos area(), perimetro() y solapar(Figura $figura). La clase Cuadrado tendrá un constructor que reciba los vértices, el color de borde, color de fondo. Tendrá un método dibujar() que devuelva los vértices y colores para poder dibujar el cuadrado.
Solución
Enunciado 6: Crear la clase Círculo (heredando de Figura)
Crear la clase Círculo (heredando de Figura)
Enunciado: Crea la clase Círculo que herede de Figura y sobrescriba los métodos area(), perimetro() y solapar(Figura $figura). Para el caso especial del círculo (no tine vertices) utilizaremos el primer Punto como el centro del círculo y el segundo Punto como un punto en la circunferencia, de manera que el radio se calcula como la distancia entre estos dos puntos. La clase Círculo debe tener un constructor que reciba los puntos, el color de borde y color de fondo. Implementa el método dibujar() que devuelva los vértices y colores para poder dibujar el círculo.
Solución
Enunciado 7: Crear la clase Rectángulo (heredando de Figura)
Crear la clase Rectángulo (heredando de Figura)
Enunciado: Crea la clase Rectángulo que herede de Figura y sobrescriba los métodos area(), perimetro() y solapar(Figura $figura). La base y el alto del rectángulo se pueden calcular a partir de los vértices. La clase Rectángulo debe tener un constructor que reciba los vértices, el color de borde y color de fondo. Implementa el método dibujar() que devuelva los vértices y colores para poder dibujar el rectángulo.
Solución
Resumen
Con este ejercicio, los estudiantes habrán practicado:
- La creación de clases y objetos en PHP.
- Herencia y sobrescritura de métodos.
- Interfaces y clases abstractas.
- Cálculos geométricos con métodos de área y perímetro.
- Creación de figuras que implementan métodos abstractos y se pueden dibujar.
Ejercicio 6: Clases y objetos en PHP - Sistema de Vehículos
Vamos a crear una jerarquía de clases para representar diferentes tipos de vehículos. Usaremos los conceptos de clases, objetos, herencia, interfaces y clases abstractas en PHP.
Enunciado 1: Crear la clase Motor
Crear la clase Motor
Enunciado: Crea una clase Motor con propiedades potencia y tipoCombustible. Implementa un constructor que inicialice estas propiedades y un método __toString que devuelva la descripción del motor en el formato Motor: Potencia = 200 CV, Tipo de Combustible = Gasolina.
Solución
Enunciado 2: Crear la clase Vehiculo (abstracta)
Crear la clase Vehiculo (abstracta)
Enunciado: Crea una clase abstracta Vehiculo con propiedades comunes como marca, modelo, color, y un motor (objeto de la clase Motor). Implementa un método abstracto calcularConsumo() y un método mostrarDetalles() que devuelva la marca, el modelo, y el color del vehículo.
Solución
Enunciado 3: Crear la interfaz Mantenimiento
Crear la interfaz Mantenimiento
Enunciado: Crea una interfaz Mantenimiento con el método necesitaMantenimiento(), que devuelve true o false dependiendo de si el vehículo necesita mantenimiento.
Enunciado 4: Crear la clase Coche (heredando de Vehiculo y Mantenimiento)
Crear la clase Coche (heredando de Vehiculo y Mantenimiento)
Enunciado: Crea la clase Coche que herede de Vehiculo y que implemente la interfaz Mantenimiento. La clase debe tener una propiedad adicional numPuertas (número de puertas) y un método calcularConsumo() que calcule el consumo de combustible (por ejemplo, 8L/100 km). Además, implementa el método necesitaMantenimiento() que devuelva true si el coche ha recorrido más de 10,000 km.
Solución
Enunciado 5: Crear la clase Camion (heredando de Vehiculo y Mantenimiento)
Crear la clase Camion (heredando de Vehiculo y Mantenimiento)
Enunciado: Crea la clase Camion que herede de Vehiculo y que implemente la interfaz Mantenimiento. La clase debe tener una propiedad adicional capacidadCarga (en kg). El método calcularConsumo() debe calcular el consumo de combustible dependiendo de la carga (por ejemplo, 15L/100 km por cada tonelada de carga). Además, implementa el método necesitaMantenimiento() que devuelva true si el camión ha recorrido más de 20,000 km.
Solución
Resumen
Con este ejercicio, los estudiantes habrán practicado:
- La creación de clases y objetos en PHP.
- Herencia entre clases como
Vehiculo,Coche, yCamion. - Interfaces como
Mantenimientopara aplicar comportamientos comunes. - Métodos abstractos en la clase
VehiculocomocalcularConsumo()que deben ser implementados en las clases hijas. - Comparar el consumo de vehículos y determinar si necesitan mantenimiento.
Ejercicio 6: Sistema de Vehículos con Repostajes y Mantenimientos Específicos
En este ejercicio, vamos a desarrollar un sistema de gestión para diferentes tipos de vehículos, como coches, motos y camiones. El sistema permitirá registrar repostajes, realizar cálculos sobre el consumo de combustible, y gestionar los mantenimientos necesarios en función de los kilómetros recorridos por cada vehículo.
Cada tipo de vehículo tendrá un conjunto de mantenimientos específicos predefinidos, que se agregarán automáticamente al crear una instancia de cada vehículo. Además, los vehículos podrán gestionar sus repostajes, actualizar los kilómetros recorridos, y calcular el consumo total o consumo actual basado en los últimos n repostajes.
Objetivos del ejercicio:
- Gestionar repostajes: Cada repostaje tiene asociados los kilómetros recorridos y los litros de combustible añadidos.
- Calcular el consumo: Se calculará el consumo total de combustible y el consumo basado en los últimos
nrepostajes. - Gestionar mantenimientos: Cada vehículo tendrá una lista de mantenimientos específicos, que deberán realizarse en momentos específicos basados en los kilómetros recorridos.
- Actualizar los mantenimientos pendientes: Cuando se realice un repostaje, se verificará si hay mantenimientos pendientes en función de los kilómetros recorridos y se actualizarán automáticamente.
Esquema del ejercicio:
- Crear la clase
Repostaje: Definir las propiedadeskilometrosylitros. - Crear la clase
Mantenimiento: Definir las propiedadeskilometrosytipopara cada tipo de mantenimiento. - Crear la clase abstracta
Vehiculo: Esta clase base tendrá propiedades comunes comomarca,modelo,color, y métodos para añadir repostajes, gestionar mantenimientos y calcular consumos. - Crear clases específicas (
Coche,Moto,Camion): Estas clases implementarán los mantenimientos específicos de cada tipo de vehículo y cargarán estos mantenimientos al crear el vehículo. - Gestionar mantenimientos: Al realizar un repostaje, el sistema verificará si hay mantenimientos pendientes en los próximos 10,000 km y los añadirá automáticamente a la lista de mantenimientos pendientes.
Este ejercicio te permitirá practicar el uso de herencia, métodos abstractos, interfaces y gestión de datos con arrays en PHP, todo ello en el contexto de un sistema realista de gestión de vehículos.
Enunciado 1: Crear la clase Repostaje
Crear la clase Repostaje
Enunciado: Vamos a crear la clase Repostaje, que representará un repostaje de combustible en el vehículo. Esta clase debe tener las propiedades kilometros (que indicará los kilómetros recorridos en el momento del repostaje) y litros (que indicará los litros de combustible añadidos).
Enunciado 2: Crear la clase Mantenimiento
Crear la clase Mantenimiento
Enunciado: Ahora crearemos la clase Mantenimiento, que representará un mantenimiento que debe realizarse en el vehículo. Esta clase debe tener dos propiedades: kilometros (que indica los kilómetros en los que debe realizarse el mantenimiento) y tipo (que describe el tipo de mantenimiento, como "Cambio de aceite", "Revisión de frenos", etc.).
Enunciado 3: Crear la clase abstracta Vehiculo
Crear la clase abstracta Vehiculo
Enunciado: Ahora vamos a crear la clase abstracta Vehiculo, que será la clase base para los diferentes tipos de vehículos (Coche, Moto, Camión). Esta clase debe contener las propiedades comunes para todos los vehículos como marca, modelo, color, motor, y kilometros. Además, debe tener métodos para añadir repostajes, consultar los repostajes realizados, y calcular el consumo total y actual. Implementaremos también un método gestionarMantenimientos para verificar si hay mantenimientos pendientes.
La clase Vehiculo debe incluir un método abstracto llamado cargarMantenimientos(), que será implementado en las clases hijas para cargar los mantenimientos específicos.
Solución
Enunciado 4: Crear la clase Coche (heredando de Vehiculo)
Crear la clase Coche (heredando de Vehiculo)
Enunciado: Vamos a crear la clase Coche, que hereda de Vehiculo y que implementará el método abstracto cargarMantenimientos(). En el constructor de esta clase se cargarán los mantenimientos específicos para el coche (por ejemplo, cambio de aceite cada 10,000 km, revisión de frenos cada 20,000 km, etc.).
Solución
Enunciado 5: Crear la clase Moto (heredando de Vehiculo)
Crear la clase Moto (heredando de Vehiculo)
Enunciado: Ahora vamos a crear la clase Moto, que también hereda de Vehiculo e implementa el método cargarMantenimientos(). Los mantenimientos específicos para la moto (por ejemplo, cambio de aceite cada 5,000 km, revisión de frenos cada 15,000 km) se cargarán automáticamente al crear una instancia de la clase Moto.
Solución
Enunciado 6: Crear la clase Camion (heredando de Vehiculo)
Crear la clase Camion (heredando de Vehiculo)
Enunciado: Finalmente, vamos a crear la clase Camion, que también hereda de Vehiculo e implementa el método cargarMantenimientos(). Los mantenimientos específicos para el camión (por ejemplo, cambio de aceite cada 20,000 km, revisión de frenos cada 40,000 km) se cargarán automáticamente.
Solución
Ejemplo de uso del código:
Ejmeplo de uso
Enunciado: A continuación, se muestra un ejemplo de cómo utilizar las clases creadas para gestionar un coche, incluyendo repostajes y mantenimientos.
Solución
Resumen
Con este ejercicio, los estudiantes habrán aprendido a:
- Crear clases abstractas y heredar de ellas en PHP.
- Gestionar repostajes y cálculos de consumo de combustible en función de los repostajes realizados.
- Añadir mantenimientos específicos para cada tipo de vehículo y gestionarlos en función de los kilómetros recorridos.
- Actualizar automáticamente los mantenimientos pendientes a medida que se realizan repostajes y se actualizan los kilómetros del vehículo.