PHP Abstract Classes

Abstract Classes in PHP
Abstract classes and methods in PHP are fundamental concepts in Object-Oriented Programming (OOP) that allow developers to define base classes with a common interface while deferring implementation details to derived classes.

This mechanism promotes code reuse, enforces design consistency, and facilitates polymorphism. In this article, we will explore how to declare abstract classes and methods in PHP, along with examples to illustrate their usage.

Declaring Abstract Classes

What is an Abstract Class?

An abstract class is a class that cannot be instantiated directly. It serves as a blueprint for other classes, allowing them to inherit its properties and methods. Abstract classes can contain abstract methods, which are methods without a body that must be implemented by derived classes. Abstract classes can also contain concrete methods, which have a body and provide shared functionality to all derived classes.

Defining an Abstract Class

To define an abstract class in PHP, use the abstract keyword before the class keyword. Here is an example:

				
					<?php
abstract class Shape {
    protected $color;

    public function __construct($color) {
        $this->color = $color;
    }

    // Abstract method
    abstract protected function calculateArea();

    // Concrete method
    public function getColor() {
        return $this->color;
    }
}
?>

				
			

In this example, the Shape class is an abstract class with one abstract method (calculateArea()) and one concrete method (getColor()). The color property and the __construct method are used to initialize the color of the shape.

Extending an Abstract Class

A concrete class that extends an abstract class must implement all the abstract methods defined in the abstract class. Here’s an example of a concrete class extending the Shape class:

				
					<?php
class Circle extends Shape {
    private $radius;

    public function __construct($color, $radius) {
        parent::__construct($color);
        $this->radius = $radius;
    }

    // Implementing the abstract method
    protected function calculateArea() {
        return pi() * pow($this->radius, 2);
    }

    public function getRadius() {
        return $this->radius;
    }
}

$circle = new Circle("red", 5);
echo "Color: " . $circle->getColor() . "\n";  // Outputs: Color: red
echo "Area: " . $circle->calculateArea() . "\n";  // Outputs: Area: 78.539816339745
?>

				
			

In this example, the Circle class extends the Shape class and implements the calculateArea() method. The Circle class also has an additional property, $radius, and a method to retrieve the radius.

Abstract Methods

What is an Abstract Method?

An abstract method is a method declared in an abstract class that does not have a body. Abstract methods are meant to be overridden in derived classes, ensuring that certain methods are implemented in all subclasses. Declaring an abstract method also means that the containing class must be declared as abstract.

Defining an Abstract Method

Abstract methods are defined using the abstract keyword before the method declaration. Here’s an example:

				
					<?php
abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    // Abstract method
    abstract protected function makeSound();

    public function getName() {
        return $this->name;
    }
}
?>

				
			

In this example, the Animal abstract class defines an abstract method makeSound() that must be implemented by any subclass of Animal.

Implementing Abstract Methods

When a concrete class extends an abstract class, it must provide implementations for all abstract methods. Here’s an example:

				
					<?php
class Dog extends Animal {
    public function makeSound() {
        return "Bark";
    }
}

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

$dog = new Dog("Buddy");
echo $dog->getName() . " says: " . $dog->makeSound() . "\n";  // Outputs: Buddy says: Bark

$cat = new Cat("Whiskers");
echo $cat->getName() . " says: " . $cat->makeSound() . "\n";  // Outputs: Whiskers says: Meow
?>

				
			

In this example, the Dog and Cat classes extend the Animal class and provide their own implementations of the makeSound() method.

Combining Abstract Classes and Concrete Methods

Abstract classes can contain a mix of abstract methods and concrete methods, allowing for shared functionality while enforcing implementation of certain methods in derived classes. This combination can be powerful in designing complex systems.

Example with Concrete and Abstract Methods

Here’s an example that combines abstract methods with concrete methods in an abstract class:

				
					<?php
abstract class Vehicle {
    protected $make;
    protected $model;

    public function __construct($make, $model) {
        $this->make = $make;
        $this->model = $model;
    }

    abstract protected function startEngine();

    public function getDetails() {
        return "{$this->make} {$this->model}";
    }
}

class Car extends Vehicle {
    protected function startEngine() {
        return "Car engine started.";
    }
}

class Motorcycle extends Vehicle {
    protected function startEngine() {
        return "Motorcycle engine started.";
    }
}

$car = new Car("Toyota", "Corolla");
echo $car->getDetails() . ": " . $car->startEngine() . "\n";  // Outputs: Toyota Corolla: Car engine started.

$motorcycle = new Motorcycle("Harley-Davidson", "Street 750");
echo $motorcycle->getDetails() . ": " . $motorcycle->startEngine() . "\n";  // Outputs: Harley-Davidson Street 750: Motorcycle engine started.
?>

				
			

In this example, the Vehicle abstract class has an abstract method startEngine() and a concrete method getDetails(). The Car and Motorcycle classes extend the Vehicle class and implement the startEngine() method.

Practical Use Case: Payment System

Abstract classes are particularly useful in scenarios where you have a common interface with multiple implementations. Consider a payment system with different payment methods:

Abstract Class for Payment

				
					<?php
abstract class Payment {
    protected $amount;

    public function __construct($amount) {
        $this->amount = $amount;
    }

    // Abstract method for processing payment
    abstract protected function processPayment();

    public function getAmount() {
        return $this->amount;
    }
}
?>

				
			

Implementing Different Payment Methods

				
					<?php
class CreditCardPayment extends Payment {
    protected function processPayment() {
        return "Processing credit card payment of {$this->amount}.";
    }
}

class PayPalPayment extends Payment {
    protected function processPayment() {
        return "Processing PayPal payment of {$this->amount}.";
    }
}

class BankTransferPayment extends Payment {
    protected function processPayment() {
        return "Processing bank transfer payment of {$this->amount}.";
    }
}

$creditCardPayment = new CreditCardPayment(100);
echo $creditCardPayment->processPayment() . "\n";  // Outputs: Processing credit card payment of 100.

$payPalPayment = new PayPalPayment(150);
echo $payPalPayment->processPayment() . "\n";  // Outputs: Processing PayPal payment of 150.

$bankTransferPayment = new BankTransferPayment(200);
echo $bankTransferPayment->processPayment() . "\n";  // Outputs: Processing bank transfer payment of 200.
?>

				
			

In this example, the Payment abstract class defines a common interface for different payment methods. The CreditCardPayment, PayPalPayment, and BankTransferPayment classes implement the processPayment() method, providing specific payment processing logic.

Conclusion

Abstract classes and methods in PHP are powerful tools that enable developers to define common interfaces while deferring implementation details to derived classes. This approach promotes code reuse, enforces design consistency, and facilitates polymorphism. By understanding how to declare and use abstract classes and methods, PHP developers can create robust and maintainable code, leveraging the full potential of Object-Oriented Programming.

In summary, abstract classes provide a blueprint for other classes, allowing them to inherit properties and methods. Abstract methods define a contract that derived classes must fulfill, ensuring consistent implementation across different subclasses. By combining abstract classes with concrete methods, developers can create flexible and scalable systems that are easy to extend and maintain.

Scroll to Top