Curriculum
Course: PHP Basic
Login

Curriculum

PHP Basic

PHP Install

0/1

PHP Casting

0/1

PHP Constants

0/1

PHP Magic Constants

0/1

PHP Operators

0/1

PHP Reference

0/276
Text lesson

PHP Abstract Classes

PHP – What are Abstract Classes and Methods?

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:

Syntax

<?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:

  • The child class method must have the same name as the abstract method and override it.
  • The access modifier of the child class method must be the same or less restrictive.
  • The number of required arguments must match, but the child class can have additional optional arguments.

Let’s look at an example:

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();
?>

Example Explained

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.

PHP – More Abstract Class Examples

Let’s examine another example where the abstract method includes an argument:

Example

<?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:

Example

<?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”);
?>