Abstract classes and methods are when the parent class has a named method, but need its child class(es) to fill out the tasks.
An abstract class is a class that contains at least one abstract method. An abstract method is a method that is declared, but not implemented in the code.
An abstract class or method is defined with the abstract keyword:
<?php abstract class ParentClass { abstract public function someMethod1(); abstract public function someMethod2($name, $color); abstract public function someMethod3() : string; } ?> |
When inheriting from an abstract class, the child class must implement the abstract methods with the same name and use the same or a less restrictive access modifier. For example, if the abstract method is protected
, the child class method must be protected
or public
, but not private
. Additionally, the method must have the same number of required arguments, though the child class can include optional arguments.
In summary, the rules for implementing methods in a child class derived from an abstract class are:
Let’s look at an example:
<?php // Parent class abstract class Car { public $name; public function __construct($name) { $this->name = $name; } abstract public function intro() : string; } // Child classes class Audi extends Car { public function intro() : string { return “Choose German quality! I’m an $this->name!”; } } class Volvo extends Car { public function intro() : string { return “Proud to be Swedish! I’m a $this->name!”; } } class Citroen extends Car { public function intro() : string { return “French extravagance! I’m a $this->name!”; } } // Create objects from the child classes $audi = new audi(“Audi”); echo $audi->intro(); echo “<br>”; $volvo = new volvo(“Volvo”); echo $volvo->intro(); echo “<br>”; $citroen = new citroen(“Citroen”); echo $citroen->intro(); ?> |
The Audi, Volvo, and Citroen classes inherit from the Car class, so they can use the public $name property and the __construct() method from the Car class.
However, intro() is an abstract method that must be implemented in each child class, and it should return a string.
Let’s examine another example where the abstract method includes an argument:
<?php abstract class ParentClass { // Abstract method with an argument abstract protected function prefixName($name); } class ChildClass extends ParentClass { public function prefixName($name) { if ($name == “John Doe”) { $prefix = “Mr.”; } elseif ($name == “Jane Doe”) { $prefix = “Mrs.”; } else { $prefix = “”; } return “{$prefix} {$name}”; } } $class = new ChildClass; echo $class->prefixName(“John Doe”); echo “<br>”; echo $class->prefixName(“Jane Doe”); ?> |
Let’s explore another example where the abstract method includes an argument, and the child class method adds two optional arguments not defined in the parent’s abstract method:
<?php abstract class ParentClass { // Abstract method with an argument abstract protected function prefixName($name); } class ChildClass extends ParentClass { // The child class may define optional arguments that are not in the parent’s abstract method public function prefixName($name, $separator = “.”, $greet = “Dear”) { if ($name == “John Doe”) { $prefix = “Mr”; } elseif ($name == “Jane Doe”) { $prefix = “Mrs”; } else { $prefix = “”; } return “{$greet} {$prefix}{$separator} {$name}”; } } $class = new ChildClass; echo $class->prefixName(“John Doe”); echo “<br>”; echo $class->prefixName(“Jane Doe”); ?> |