Worldscope

PHP Abstract Classes

Palavras-chave:

Publicado em: 03/08/2025

Understanding PHP Abstract Classes

Abstract classes in PHP provide a blueprint for other classes. They cannot be instantiated directly but serve as a foundation upon which concrete classes are built. This article explores the concept of abstract classes, their implementation, and when to use them effectively.

Fundamental Concepts / Prerequisites

To understand abstract classes, you should have a basic understanding of the following PHP concepts:

  • Object-Oriented Programming (OOP) principles: Classes, Objects, Inheritance, Polymorphism.
  • Class definitions and instantiation.
  • Method declaration and usage.

Abstract Class Implementation in PHP

An abstract class is defined using the abstract keyword before the class keyword. An abstract class may contain abstract methods (methods without implementation) and concrete methods (methods with implementation). Any class that extends an abstract class must implement all of its abstract methods unless the extending class is also declared abstract.


<?php

abstract class AbstractAnimal {
    // Abstract method (no implementation)
    abstract public function makeSound();

    // Concrete method (with implementation)
    public function eat() {
        return "Animal is eating...\n";
    }
}

class Dog extends AbstractAnimal {
    // Must implement the abstract method makeSound()
    public function makeSound() {
        return "Woof!\n";
    }
}

class Cat extends AbstractAnimal {
    // Must implement the abstract method makeSound()
    public function makeSound() {
        return "Meow!\n";
    }
}

// $animal = new AbstractAnimal(); // This will cause an error because you can't instantiate an abstract class

$dog = new Dog();
echo $dog->makeSound(); // Output: Woof!
echo $dog->eat();       // Output: Animal is eating...

$cat = new Cat();
echo $cat->makeSound(); // Output: Meow!
echo $cat->eat();       // Output: Animal is eating...

?>

Code Explanation

The code defines an abstract class AbstractAnimal with an abstract method makeSound() and a concrete method eat().

The abstract public function makeSound(); declaration forces any class extending AbstractAnimal to implement the makeSound() method.

The eat() method is a concrete method, meaning it has an implementation. It's inherited by the Dog and Cat classes.

The Dog and Cat classes extend the AbstractAnimal class and provide their own implementations for the makeSound() method.

Attempting to instantiate AbstractAnimal would result in a fatal error because abstract classes cannot be instantiated directly.

Complexity Analysis

The time complexity of accessing the methods defined in the child classes (Dog and Cat) is O(1). This is because method calls are resolved at compile time. The space complexity is dependent on the size of the class definitions and the instantiated objects. The memory footprint is proportional to the number of properties and objects created.

Alternative Approaches

An alternative approach would be to use interfaces. Interfaces define a contract that classes must adhere to, but they cannot contain any implementation details. Using interfaces would allow more flexibility in cases where inheritance is not strictly necessary or desired. However, interfaces cannot contain any concrete methods, meaning that all methods must be implemented by the implementing class. Abstract classes can contain concrete methods that are shared among the child classes, reducing code duplication. Abstract classes can also have properties, unlike interfaces.

Conclusion

Abstract classes are a powerful tool in PHP for defining a common interface for related classes. They provide a way to enforce a certain structure and ensure that all derived classes implement specific methods. Abstract classes promote code reusability and maintainability, making them valuable in large and complex applications. They differ from interfaces in that they can contain concrete methods and properties, offering a balance between rigid contracts (interfaces) and inheritance-based code sharing.