W3docs

abstract

En PHP, la palabra clave abstract define clases y métodos abstractos. Una clase abstracta no puede instanciarse y está diseñada para ser extendida.

La palabra clave abstract en PHP

La palabra clave abstract marca una clase o método como incompleto a propósito. Una clase abstracta define una forma común y un comportamiento compartido, pero no puede convertirse en un objeto por sí sola — existe para ser extendida. Un método abstracto declara la firma de un método sin cuerpo, obligando a cada subclase concreta a proporcionar la implementación real.

Esta página cubre qué son las clases y los métodos abstractos, cómo declararlos, las reglas que PHP aplica y cuándo usar abstract es la decisión de diseño correcta.

¿Qué es una clase abstracta?

Una clase abstracta es una clase que no se puede instanciar directamente. Está diseñada para ser extendida por otras clases que completen las partes faltantes. Una clase abstracta puede combinar dos tipos de miembros:

  • Métodos abstractos — declarados pero no implementados, dejando el trabajo a las subclases.
  • Métodos y propiedades concretos — completamente implementados y heredados tal cual, de modo que la lógica compartida reside en un solo lugar.

La regla es unidireccional: una clase con al menos un método abstracto debe declararse como abstract. Lo contrario no es obligatorio — una clase puede ser abstracta sin tener ningún método abstracto, simplemente para evitar que sea instanciada.

<?php

abstract class Animal {
    // Concrete method — inherited by every subclass unchanged
    public function describe(): string {
        return "I am a " . static::class . " and I say " . $this->makeSound();
    }

    // Abstract method — each subclass must implement it
    abstract public function makeSound(): string;
}

¿Qué es un método abstracto?

Un método abstracto se declara con la palabra clave abstract, no tiene cuerpo y termina con un punto y coma en lugar de { ... }. Su función es definir un contrato: cualquier subclase que quiera ser concreta debe proporcionar una implementación compatible.

<?php

abstract public function makeSound(): string; // signature only, no body

Una subclase debe mantener el método compatible con la declaración abstracta — los mismos parámetros (o compatibles) y una visibilidad igual o menos restrictiva que la original.

Cómo definir una clase y un método abstractos

Coloca abstract antes de class para hacer abstracta la clase, y antes de function para hacer abstracto un método. Aquí está el patrón completo — una clase base con un método compartido y un método abstracto, más dos subclases concretas:

<?php

abstract class Animal {
    public function describe(): string {
        return static::class . " says " . $this->makeSound();
    }

    abstract public function makeSound(): string;
}

class Dog extends Animal {
    public function makeSound(): string {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function makeSound(): string {
        return "Meow!";
    }
}

echo (new Dog())->describe(), "\n"; // Dog says Woof!
echo (new Cat())->describe(), "\n"; // Cat says Meow!

Cada subclase implementa makeSound() y hereda describe() de forma gratuita — ese método compartido es exactamente la razón por la que una clase base abstracta es más útil que una interfaz simple aquí.

¿Qué ocurre si intentas instanciar una clase abstracta?

Intentar crear un objeto a partir de una clase abstracta es un error fatal, detectado en tiempo de compilación:

<?php

abstract class Animal {
    abstract public function makeSound(): string;
}

$a = new Animal();
// Fatal error: Cannot instantiate abstract class Animal

El mismo error se produce si una subclase olvida implementar un método abstracto heredado — PHP trata esa subclase como todavía abstracta.

Reglas y advertencias

  • Una clase con cualquier método abstracto debe declararse como abstract.
  • Los métodos abstractos no pueden ser private — las subclases no podrían verlos para sobrescribirlos. Usa public o protected.
  • Los métodos abstractos no pueden ser final (están pensados para ser sobrescritos) y, desde PHP 8.0, no pueden ser static de una forma significativamente sobrescribible — se prefieren los métodos abstractos de instancia.
  • Una clase abstracta puede tener un constructor; las subclases lo invocan con parent::__construct().
  • Una subclase que no implementa todos los métodos abstractos heredados debe declararse ella misma como abstract.

Clase abstracta frente a interfaz

Ambas definen un contrato, pero responden a preguntas distintas:

  • Una clase abstracta ("es-un") puede contener métodos concretos, propiedades y constructores. Una clase solo puede extender una clase abstracta.
  • Una interfaz ("puede-hacer") declara únicamente firmas de métodos (sin implementación ni estado de instancia) y una clase puede implementar muchas interfaces.

Utiliza una clase abstracta cuando las subclases comparten implementación real; utiliza una interfaz cuando solo necesitas garantizar una capacidad. Consulta PHP Inheritance y PHP Interfaces para más información.

Conclusión

La palabra clave abstract te permite definir un plano parcial: una clase abstracta proporciona comportamiento compartido mientras declara métodos abstractos que cada subclase concreta debe implementar. No se puede instanciar una clase abstracta directamente — ese es precisamente su propósito. Úsala cuando varias clases relacionadas comparten lógica pero cada una necesita personalizar pasos específicos, y elige una interfaz cuando no hay implementación compartida involucrada.

Práctica

Práctica
¿Cuáles son las reglas sobre las clases y métodos abstractos en PHP según w3docs.com?
¿Cuáles son las reglas sobre las clases y métodos abstractos en PHP según w3docs.com?
Was this page helpful?