Klasat Abstrakte në OOP në PHP

Le të supozojmë se keni një klasë User, dhe prej saj trashëgohen klasat Employee dhe Student.

Në këtë rast, supozohet se ju do të krijoni objekte të klasave Employee dhe Student, por objektet e klasës User - nuk do t'i krijoni, sepse kjo klasë përdoret vetëm për grupimin e vetive dhe metodave të përgjithshme të trashëgimtarëve të saj.

Në këtë rast mund të ndalohet me forcë krijimi i objekteve të klasës User, në mënyrë që ju ose një programues tjetër diku aksidentalisht të mos i krijoni ato.

Për këtë ekzistojnë të ashtuquajturat klasa abstrakte. Klasat abstrakte përfaqësojnë klasa të destinuara për trashëgim prej tyre. Në këtë rast, objektet e këtyre klasave nuk mund të krijohen.

Që të deklarohet një klasë si abstrakte, duhet të shkruhet fjala kyçe abstract gjatë deklarimit të saj:

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

Pra, le të shkruajmë implementimin e klasës abstrakte User. Le të ketë një veti private name, si dhe getters dhe setters për të:

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

Përpjekja për të krijuar një objekt të klasës User do të shkaktojë gabim:

index.php<?php
  $user = new User; // do të japë gabim
?>

Por nga ana tjetër, do të jetë e mundur të trashëgohet nga klasa jonë. Le të bëjmë klasën Employee, e cila do të trashëgojë nga klasa jonë abstrakte User:

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

Le të krijojmë një objekt të klasës Employee - gjithçka do të funksionojë:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // metoda e prindit, d.m.th. e klasës User
  $employee->setSalary(1000);  // metoda e vet, d.m.th. e klasës Employee
  
  echo $employee->getName();   // do të shfaqë 'john'
  echo $employee->getSalary(); // do të shfaqë 1000
?>
Задание 1

Bëni një klasë abstrakte Figure, që përfaqëson një figurë gjeometrike. Le të trashëgojnë prej saj klasat për rrethin, drejtkëndëshin dhe katrorin.