Abstraktné metódy v OOP v PHP

Abstraktné triedy môžu obsahovať aj abstraktné metódy. Takéto metódy by nemali mať implementáciu, ale slúžia na to, aby určili, že takéto metódy musia mať potomkovia. A samotná implementácia týchto metód - je už úlohou potomkov.

Na to, aby sme deklarovali metódu ako abstraktnú, pri jej deklarácii musíme napísať kľúčové slovo abstract.

Skúsme to v praxi. Predpokladajme, že všetci potomkovia triedy User musia mať metódu increaseRevenue.

Táto metóda by mala zobrať aktuálny príjem používateľa a zvýšiť ho o určitú hodnotu, odovzdanú ako parameter.

Samotná trieda User nevie, aký presne príjem bude mať potomok - veď u zamestnanca je to plat, a u študenta - štipendium. Preto každý potomok bude implementovať túto metódu inak.

Podstata je v tom, že abstraktná metóda triedy User núti programátora implementovať túto metódu v potomkoch, inak PHP vyhodí chybu. Takto vy, alebo iný programátor, ktorý pracuje s vaším kódom, v žiadnom prípade nemôžete zabudnúť implementovať požadovanú metódu v potomkovi.

Poďme to vyskúšať v praxi. Pridajme abstraktnú metódu increaseRevenue do triedy User:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Abstraktná metóda bez tela:
    abstract public function increaseRevenue($value);
  }
?>

Nechajme našu triedu Employee zatiaľ bez zmien. V tomto prípade, aj keď nevytvoríme objekt triedy Employee, ale iba spustíme kód, v ktorom sú definované naše triedy - PHP vyhodí chybu.

Teraz napíšme implementáciu metódy increaseRevenue v triede Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Napíšme implementáciu metódy:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Skontrolujme fungovanie našej triedy:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');
  $employee->setSalary(1000);
  $employee->increaseRevenue(100);
  
  echo $employee->getSalary();
?>

Implementujme metódu increaseRevenue aj v triede Student. Lenže teraz naša metóda bude zvyšovať už štipendium:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // štipendium
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // Metóda zvyšuje štipendium:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

Pridajte do vašej triedy User rovnakú abstraktnú metódu increaseRevenue. Napíšte implementáciu tejto metódy v triedach Employee a Student.

Задание 2

V triede Figure vytvorte abstraktné metódy na získanie obsahu a obvodu útvaru.