Abstrakta klasser i OOP i PHP

Låt oss säga att du har en klass User, och från den ärver klasserna Employee och Student.

Samtidigt antas det att du kommer att skapa objekt av klasserna Employee och Student, men objekt av klassen User - kommer du inte, eftersom denna klass endast används för gruppering av gemensamma egenskaper och metoder för sina ärvlingar.

I detta fall kan man med kraft förbjuda skapandet av objekt av klassen User, så att du eller en annan programmerare någonstans av misstag inte skapar dem.

För detta finns så kallade abstrakta klasser. Abstrakta klasser är klasser avsedda för arv från dem. Samtidigt går det inte att skapa objekt av sådana klasser.

För att deklarera en klass som abstrakt behöver man vid dess deklaration skriva nyckelordet abstract:

User.php<?php
  abstract class User
  {
    
  }
?>

Så, låt oss skriva implementationen av den abstrakta klassen User. Låt den ha en privat egenskap name, samt getters och setters för den:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
  }
?>

Ett försök att skapa ett objekt av klassen User kommer att orsaka ett fel:

index.php<?php
  $user = new User; // kommer att ge ett fel
?>

Däremot kommer det att gå att ärva från vår klass. Låt oss skapa klassen Employee, som kommer att ärva från vår abstrakta klass User:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
  }
?>

Låt oss skapa ett objekt av klassen Employee - allt kommer att fungera:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // föräldermetod, dvs. klassen User
  $employee->setSalary(1000);  // egen metod, dvs. klassen Employee
  
  echo $employee->getName();   // kommer att skriva ut 'john'
  echo $employee->getSalary(); // kommer att skriva ut 1000
?>
Задание 1

Skapa en abstrakt klass Figure, som representerar en geometrisk figur. Låt klasser för cirkel, rektangel och kvadrat ärva från den.