Introducción a la POO en PHP

Intermedio
PHP
PHP
Actualizado: 24/03/2025

¡Desbloquea el curso de PHP completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

Conceptos básicos de POO

La Programación Orientada a Objetos (POO) es un paradigma de programación que organiza el código en clases y objetos, facilitando la modularidad y reutilización del código. En PHP, la POO permite modelar entidades del mundo real y sus interacciones dentro del software.

Una clase es una plantilla que define las propiedades (atributos) y métodos (comportamientos) que los objetos creados a partir de ella tendrán. Las propiedades son variables que representan el estado del objeto, mientras que los métodos son funciones que definen su comportamiento.

Para declarar una clase en PHP, se utiliza la palabra clave class seguida del nombre de la clase:

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

    public function arrancar()
    {
        echo "El coche está arrancando.\n";
    }
}

En este ejemplo, la clase Coche tiene dos propiedades públicas $marca y $modelo, y un método público arrancar() que imprime un mensaje.

Un objeto es una instancia de una clase. Para crear un objeto, se utiliza el operador new:

$coche1 = new Coche();
$coche1->marca = "Toyota";
$coche1->modelo = "Corolla";
$coche1->arrancar(); // Salida: El coche está arrancando.

Aquí, $coche1 es un objeto de la clase Coche con sus propias propiedades y métodos.

Las propiedades y métodos pueden tener distintos niveles de visibilidad:

  • public: Accesible desde cualquier lugar.
  • protected: Accesible solo desde la clase y sus subclases.
  • private: Accesible únicamente desde la clase que lo define.

La herencia es un mecanismo que permite crear nuevas clases basadas en clases existentes, heredando sus propiedades y métodos. Se utiliza la palabra clave extends para indicar que una clase hereda de otra:

class Deportivo extends Coche
{
    public function activarTurbo()
    {
        echo "Turbo activado.\n";
    }
}

En este caso, la clase Deportivo hereda de Coche y añade el método activarTurbo().

La encapsulación es el principio que restringe el acceso directo a ciertas componentes de un objeto, protegiendo su estado interno. Esto se logra mediante los modificadores de acceso y métodos específicos para interactuar con las propiedades, como getters y setters.

El polimorfismo permite que objetos de diferentes clases puedan ser tratados como objetos de una clase común. Esto es especialmente útil al utilizar interfaces y clases abstractas, que definen métodos que deben ser implementados por las clases que las utilizan.

La palabra clave this se utiliza dentro de una clase para hacer referencia al objeto actual. Por ejemplo, para acceder a una propiedad o método dentro de la misma clase:

public function mostrarInformacion()
{
    echo "Marca: " . $this->marca . ", Modelo: " . $this->modelo . "\n";
}

La Programación Orientada a Objetos en PHP permite escribir código más estructurado y fácil de mantener al modelar entidades como objetos con atributos y comportamientos bien definidos.

Ventajas de la POO

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

La Programación Orientada a Objetos (POO) ofrece múltiples ventajas en el desarrollo de aplicaciones en PHP, permitiendo crear código más estructurado, modular y fácil de mantener.

  • Una de las principales ventajas es la modularidad, ya que al dividir el código en clases y objetos, cada componente puede desarrollarse y probarse de forma independiente. Esto facilita la detección y corrección de errores, además de mejorar la organización del proyecto.
  • La reutilización es esencial en la POO. Mediante herencia y composición, es posible crear nuevas clases basadas en clases existentes, reutilizando código y reduciendo la duplicación. Esto potencia la eficiencia en el desarrollo y simplifica el mantenimiento.
  • La encapsulación protege el estado interno de los objetos, exponiendo solo lo necesario a través de interfaces públicas. Al controlar el acceso a las propiedades y métodos, se mejora la seguridad y se previene la manipulación indebida de datos internos.
  • El polimorfismo permite tratar objetos de diferentes clases de forma uniforme si comparten una misma interfaz o clase base. Esto simplifica la gestión de colecciones de objetos y habilita comportamientos dinámicos en tiempo de ejecución.
  • La abstracción es fundamental para manejar la complejidad. Al centrarse en las características esenciales y ocultar los detalles de implementación, se facilita la comprensión del código y se promueve un diseño más claro y conciso.
  • La POO mejora la mantenibilidad del software. Con clases bien definidas y responsabilidades claras, las actualizaciones y ampliaciones pueden realizarse con menor riesgo de introducir errores. Esto conduce a un ciclo de desarrollo más eficiente y sostenible.
  • La escalabilidad es otra ventaja notable. La POO permite que las aplicaciones crezcan en funcionalidad sin comprometer la estructura existente, facilitando la incorporación de nuevos módulos y adaptaciones a futuros requerimientos.

La POO fomenta la colaboración entre desarrolladores. Al seguir principios y patrones de diseño comunes, diferentes miembros del equipo pueden trabajar en partes específicas del proyecto sin interferencias, lo que aumenta la productividad y coherencia del código.

Listado de mecanismos de POO en PHP

La Programación Orientada a Objetos en PHP cuenta con diversos mecanismos que permiten construir aplicaciones robustas y escalables. 

Listado de los principales mecanismos de POO disponibles:

  • Clases y objetos
    • Las clases son plantillas que definen las propiedades y métodos que los objetos instanciarán. 
    • Los objetos son instancias de clases que pueden interactuar entre sí.
<?php
class Usuario
{
    public string $nombre;
    public int $edad;

    public function mostrarInformacion(): void
    {
        echo "Nombre: " . $this->nombre . ", Edad: " . $this->edad . "\n";
    }
}

$usuario = new Usuario();
$usuario->nombre = "Ana";
$usuario->edad = 30;
$usuario->mostrarInformacion(); // Salida: Nombre: Ana, Edad: 30
  • Constructores y destructores: El método mágico __construct() se utiliza para inicializar objetos al crearlos, mientras que __destruct() se ejecuta al destruirlos.
class Conexion
{
    private $conexion;

    public function __construct(string $dsn)
    {
        $this->conexion = new PDO($dsn);
    }

    public function __destruct()
    {
        $this->conexion = null;
    }
}
  • Herencia: Permite que una clase hija herede propiedades y métodos de una clase padre usando extends, promoviendo la reutilización de código.
class Animal
{
    public function comer(): void
    {
        echo "El animal está comiendo.\n";
    }
}

class Perro extends Animal
{
    public function ladrar(): void
    {
        echo "El perro está ladrando.\n";
    }
}

$perro = new Perro();
$perro->comer();   // Salida: El animal está comiendo.
$perro->ladrar();  // Salida: El perro está ladrando.
  • Visibilidad: Controla el acceso a propiedades y métodos mediante los modificadores public, protected y private, lo que facilita la encapsulación.
  • Clases y métodos abstractos: Las clases abstractas no pueden ser instanciadas y pueden contener métodos abstractos que deben ser implementados por las clases hijas.
abstract class Vehiculo
{
    abstract public function acelerar(): void;
}

class Coche extends Vehiculo
{
    public function acelerar(): void
    {
        echo "El coche está acelerando.\n";
    }
}
  • Interfaces: Definen un contrato que las clases deben cumplir, asegurando que implementen métodos específicos. Se declaran con la palabra clave interface.
interface Enviable
{
    public function enviar(string $destino): void;
}

class Mensaje implements Enviable
{
    public function enviar(string $destino): void
    {
        echo "Enviando mensaje a " . $destino . "\n";
    }
}
  • Traits: Son mecanismos para reutilizar código en múltiples clases sin usar herencia. Se incluyen en las clases con la palabra clave use.
trait Logger
{
    public function log(string $mensaje): void
    {
        echo "Log: " . $mensaje . "\n";
    }
}

class Servicio
{
    use Logger;
}

$servicio = new Servicio();
$servicio->log("Servicio iniciado"); // Salida: Log: Servicio iniciado
  • Namespaces: Los espacios de nombres organizan el código y evitan conflictos entre clases o funciones con el mismo nombre en diferentes partes del programa.
namespace Aplicacion\Modelos;

class Producto
{
    // Código de la clase Producto
}

use Aplicacion\Modelos\Producto;

$producto = new Producto();
  • Autoloading: Facilita la carga automática de clases cuando se necesitan, utilizando spl_autoload_register() y siguiendo estándares como PSR-4.
spl_autoload_register(function ($clase) {
    $ruta = __DIR__ . '/' . str_replace('\\', '/', $clase) . '.php';
    if (file_exists($ruta)) {
        require $ruta;
    }
});
  • Propiedades y métodos estáticos: Pertenecen a la clase en lugar de a una instancia. Se accede a ellos usando el operador ::.
class Configuracion
{
    public static string $entorno = "producción";

    public static function mostrarEntorno(): void
    {
        echo "Entorno: " . self::$entorno . "\n";
    }
}

Configuracion::mostrarEntorno(); // Salida: Entorno: producción
  • Clases anónimas: Permiten crear objetos sin definir una clase nombrada, útiles para implementaciones rápidas.
$controlador = new class {
    public function ejecutar(): void
    {
        echo "Ejecutando controlador anónimo.\n";
    }
};

$controlador->ejecutar(); // Salida: Ejecutando controlador anónimo.
  • Type hints y tipado fuerte: PHP admite tipos estrictos en propiedades, parámetros y valores de retorno, incluyendo tipos de unión (|) y tipos de intersección (&).
function procesarDatos(array|Traversable $datos): void
{
    foreach ($datos as $dato) {
        echo $dato . "\n";
    }
}
  • Enums: Introducidos en PHP 8.1, los enum permiten definir un conjunto limitado de valores posibles para un tipo.
enum Direccion
{
    case NORTE;
    case SUR;
    case ESTE;
    case OESTE;
}

$marcha = Direccion::NORTE;
  • Clases readonly: A partir de PHP 8.2, es posible definir clases donde todas las propiedades son de solo lectura usando la palabra clave readonly.
readonly class Punto
{
    public int $x;
    public int $y;

    public function __construct(int $x, int $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
}

$punto = new Punto(5, 10);
  • Métodos mágicos: Son métodos especiales que comienzan con __ y permiten interactuar con la funcionalidad interna de objetos, como __get(), __set(), __call(), entre otros.
class MiClase
{
    private array $datos = [];

    public function __set(string $nombre, $valor): void
    {
        $this->datos[$nombre] = $valor;
    }

    public function __get(string $nombre)
    {
        return $this->datos[$nombre] ?? null;
    }
}

$obj = new MiClase();
$obj->atributo = "Valor dinámico";
echo $obj->atributo . "\n"; // Salida: Valor dinámico
  • Clases finales y métodos finales: Mediante la palabra clave final, se evita que las clases o métodos sean extendidos o sobrescritos, garantizando la integridad del comportamiento.
final class Base
{
    final public function ejecutar(): void
    {
        echo "Ejecutando método final.\n";
    }
}
  • Funciones de primera clase: PHP 8.1 introdujo una nueva sintaxis para referenciar funciones y métodos como valores, mejorando el manejo de callables.
function sumar(int $a, int $b): int
{
    return $a + $b;
}

$operacion = sumar(...);
echo $operacion(2, 3) . "\n"; // Salida: 5
  • Deprecación de propiedades dinámicas: PHP 8.2 depreca la creación de propiedades dinámicas en objetos que no permiten propiedades mágicas, fomentando un código más seguro y predecible.

Estos mecanismos proporcionan una base sólida para aplicar principios de diseño orientado a objetos en PHP, permitiendo desarrollar aplicaciones más seguras, mantenibles y eficientes.

Aprendizajes de esta lección de PHP

  • Comprender el paradigma de POO y su aplicación en PHP.
  • Declarar y utilizar clases, propiedades y métodos.
  • Aplicar herencia para crear jerarquías de clases.
  • Implementar visibilidad para encapsular datos.
  • Utilizar abstractos e interfaces para diseñar código flexible.
  • Emplear traits y namespaces para organización y reutilización.

Completa este curso de PHP y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración