PHP: Programación Orientada a Objetos

Descubre cómo aprender PHP desde el enfoque de la Programación Orientada a Objetos, aplicando conceptos como clases, objetos, herencia y polimorfismo para desarrollar aplicaciones más organizadas y mantenibles.

Aprende PHP GRATIS y certifícate

La Programación Orientada a Objetos (POO) en PHP permite diseñar código con una estructura modular, basada en clases y objetos que agrupan lógica y datos de forma coherente. Este enfoque facilita la escalabilidad de proyectos y potencia la reutilización de funcionalidades.


Clases y objetos

En PHP, una clase describe las características y comportamientos de un tipo de objeto. Cada vez que se crea una instancia de esa clase, se obtiene un objeto que hereda todas las propiedades y métodos definidos.

<?php
class Coche {
    public $marca;
    public $modelo;

    public function arrancar() {
        echo "El coche está en marcha.";
    }
}

$miCoche = new Coche();
$miCoche->marca = "Toyota";
$miCoche->modelo = "Corolla";
$miCoche->arrancar();
?>

En este ejemplo, la clase Coche tiene dos atributos (marca y modelo) y un método (arrancar). Con la palabra reservada new creas un objeto a partir de esa clase.


Encapsulación

La encapsulación consiste en proteger los atributos y métodos internos de una clase, de forma que solo puedan modificarse a través de métodos específicos (getters y setters). Esto se controla mediante modificadores de acceso: public, protected y private.

<?php
class Usuario {
    private $nombre;

    public function setNombre($nombre) {
        $this->nombre = $nombre;
    }

    public function getNombre() {
        return $this->nombre;
    }
}

$usuario = new Usuario();
$usuario->setNombre("Lucía");
echo $usuario->getNombre(); // "Lucía"
?>

Al utilizar private, se restringe el acceso directo a la propiedad $nombre, garantizando la integridad de los datos.


Herencia

La herencia permite que una clase hija extienda las propiedades y métodos de otra clase (padre). De este modo, se promueve la reutilización de código y se evita duplicar lógica:

<?php
class Animal {
    public function hacerSonido() {
        echo "Sonido genérico de animal.";
    }
}

class Perro extends Animal {
    public function hacerSonido() {
        echo "¡Guau, guau!";
    }
}

$miPerro = new Perro();
$miPerro->hacerSonido(); // "¡Guau, guau!"
?>

La clase Perro hereda de Animal pero redefine el método hacerSonido para adaptarlo a su caso particular, ejemplificando el uso de polimorfismo.


Polimorfismo

El polimorfismo se manifiesta cuando distintas clases comparten métodos con el mismo nombre, pero cada una implementa su propia lógica. De esta manera, los objetos pueden responder de formas diferentes a la misma llamada de método.

<?php
class Figura {
    public function dibujar() {
        echo "Dibujando una figura genérica.";
    }
}

class Circulo extends Figura {
    public function dibujar() {
        echo "Dibujando un círculo.";
    }
}

class Rectangulo extends Figura {
    public function dibujar() {
        echo "Dibujando un rectángulo.";
    }
}

$formas = [new Circulo(), new Rectangulo()];

foreach ($formas as $forma) {
    $forma->dibujar();
}
?>

Al iterar sobre formas, cada objeto implementa su propia versión del método dibujar, demostrando la flexibilidad de la POO.


Constructores y destructores

En PHP, el método __construct se ejecuta automáticamente al crear un objeto, y se utiliza para inicializar propiedades u otros requisitos. Opcionalmente, se puede usar __destruct para liberar recursos al destruir el objeto.

<?php
class ConexionBD {
    private $enlace;

    public function __construct($servidor, $usuario, $password) {
        $this->enlace = mysqli_connect($servidor, $usuario, $password);
        echo "Conexión establecida.";
    }

    public function __destruct() {
        mysqli_close($this->enlace);
        echo "Conexión cerrada.";
    }
}
?>

Con los constructores y destructores se automatizan procedimientos que ocurren al inicio y al final del ciclo de vida del objeto.


Interfaces y clases abstractas

Para definir contratos que deban cumplir varias clases, se utilizan interfaces. Estas describen métodos sin implementación:

<?php
interface Volable {
    public function volar();
}

class Pajaro implements Volable {
    public function volar() {
        echo "El pájaro está volando.";
    }
}
?>

Las clases abstractas funcionan de manera similar, pero permiten definir tanto métodos sin cuerpo como métodos con lógica. Las clases que la extienden deben completar los métodos abstractos.


Recomendaciones y buenas prácticas

  • Usa nombres descriptivos para clases, métodos y propiedades, evitando abreviaturas confusas.
  • Mantén una estructura clara en cada clase, separando el constructor, los métodos públicos y los métodos privados.
  • Aplica el principio de responsabilidad única, procurando que cada clase se encargue de una tarea concreta.
  • Recurre a la herencia con moderación, prefiriendo la composición en situaciones donde sea posible.
Empezar curso de PHP

Lecciones de este módulo de PHP

Lecciones de programación del módulo Programación Orientada a Objetos del curso de PHP.

Ejercicios de programación en este módulo de PHP

Evalúa tus conocimientos en Programación Orientada a Objetos con ejercicios de programación Programación Orientada a Objetos de tipo Test, Puzzle, Código y Proyecto con VSCode.