Programación Orientada a Objetos en PHP

Objetivos de Aprendizaje
  • Comprender los conceptos fundamentales de la POO
  • Implementar clases y objetos en PHP
  • Utilizar herencia y polimorfismo
  • Trabajar con métodos y propiedades estáticas
  • Implementar interfaces y clases abstractas

Clases y Objetos

En PHP, una clase es una plantilla para crear objetos. Define las propiedades y métodos que tendrán los objetos creados a partir de ella.

clases_objetos.php

<?php
// Definir una clase
class Persona {
    // Propiedades
    private $nombre;
    private $edad;

    // Constructor
    public function __construct($nombre, $edad) {
        $this->nombre = $nombre;
        $this->edad = $edad;
    }

    // Métodos
    public function saludar() {
        return "Hola, soy " . $this->nombre;
    }

    public function getEdad() {
        return $this->edad;
    }

    public function cumpleanos() {
        $this->edad++;
    }
}

// Crear un objeto
$persona = new Persona("Juan", 25);
echo $persona->saludar(); // Salida: Hola, soy Juan
echo $persona->getEdad(); // Salida: 25
?>
                        

Herencia

La herencia permite crear nuevas clases basadas en clases existentes. La clase hija hereda todas las propiedades y métodos públicos y protegidos de la clase padre.

herencia.php

<?php
class Empleado extends Persona {
    private $puesto;
    private $salario;

    public function __construct($nombre, $edad, $puesto, $salario) {
        parent::__construct($nombre, $edad);
        $this->puesto = $puesto;
        $this->salario = $salario;
    }

    public function getPuesto() {
        return $this->puesto;
    }

    public function getSalario() {
        return $this->salario;
    }

    // Sobrescribir método de la clase padre
    public function saludar() {
        return parent::saludar() . " y trabajo como " . $this->puesto;
    }
}

$empleado = new Empleado("María", 30, "Desarrolladora", 50000);
echo $empleado->saludar(); 
// Salida: Hola, soy María y trabajo como Desarrolladora
?>
                        

Interfaces y Clases Abstractas

Las interfaces y clases abstractas son herramientas fundamentales para definir contratos y compartir funcionalidad entre clases.

interfaces_clases_abstractas.php

<?php
// Interfaz
interface Trabajador {
    public function trabajar();
    public function descansar();
}

// Clase abstracta
abstract class Profesional {
    protected $especialidad;
    
    public function __construct($especialidad) {
        $this->especialidad = $especialidad;
    }
    
    abstract public function ejercer();
    
    public function getEspecialidad() {
        return $this->especialidad;
    }
}

// Implementación
class Programador extends Profesional implements Trabajador {
    private $lenguaje;
    
    public function __construct($especialidad, $lenguaje) {
        parent::__construct($especialidad);
        $this->lenguaje = $lenguaje;
    }
    
    public function trabajar() {
        return "Programando en " . $this->lenguaje;
    }
    
    public function descansar() {
        return "Tomando un café";
    }
    
    public function ejercer() {
        return "Desarrollando software como " . $this->especialidad;
    }
}

$programador = new Programador("Backend Developer", "PHP");
echo $programador->trabajar(); // Salida: Programando en PHP
echo $programador->ejercer(); // Salida: Desarrollando software como Backend Developer
?>

Propiedades y Métodos Estáticos

Los miembros estáticos pertenecen a la clase en lugar de a una instancia específica. Se pueden acceder sin crear un objeto de la clase.

propiedades_metodos_estaticos.php

<?php
class Matematica {
    public static $pi = 3.14159;
    private static $contador = 0;
    
    public static function sumar($a, $b) {
        self::$contador++;
        return $a + $b;
    }
    
    public static function getContador() {
        return self::$contador;
    }
}

// Usar miembros estáticos
echo Matematica::$pi; // Salida: 3.14159
echo Matematica::sumar(5, 3); // Salida: 8
echo Matematica::getContador(); // Salida: 1
?>

Ejercicio Práctico

Desarrolla un sistema de gestión de biblioteca que incluya:

  1. Una clase abstracta Documento con métodos comunes
  2. Clases Libro, Revista y DVD que hereden de Documento
  3. Una interfaz Prestable con métodos para prestar y devolver
  4. Una clase Biblioteca que gestione el inventario
Sugerencia

Utiliza propiedades estáticas para mantener el registro del total de documentos y implementa métodos para buscar por diferentes criterios.