Abstraktní metody v OOP v PHP

Abstraktní třídy mohou také obsahovat abstraktní metody. Takové metody by neměly mít implementaci, ale slouží k tomu, aby určily, že takové metody musí mít potomci. A vlastní implementace těchto metod - je již úkolem potomků.

Pro deklaraci abstraktní metody je třeba při její deklaraci napsat klíčové slovo abstract.

Pojďme to vyzkoušet v praxi. Předpokládejme, že všichni potomci třídy User musí mít metodu increaseRevenue.

Tato metoda by měla vzít aktuální příjem uživatele a zvýšit jej o určitou hodnotu předanou parametrem.

Samotná třída User neví, jaký přesně příjem bude mít potomek - u zaměstnance je to plat, zatímco u studenta - stipendium. Proto každý potomek bude tuto metodu implementovat svým vlastním způsobem.

Podstata spočívá v tom, že abstraktní metoda třídy User nutí programátora implementovat tuto metodu v potomcích, jinak PHP vypíše chybu. Tímto způsobem vy, nebo jiný programátor, pracující s vaším kódem, nemůžete zapomenout implementovat požadovanou metodu v potomkovi.

Pojďme to tedy vyzkoušet v praxi. Přidejme abstraktní metodu increaseRevenue do třídy User:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Abstraktní metoda bez těla:
    abstract public function increaseRevenue($value);
  }
?>

Nechme naši třídu Employee prozatím beze změn. V tomto případě, i když nevytváříme objekt třídy Employee, ale pouze spustíme kód, ve kterém jsou definovány naše třídy - PHP vypíše chybu.

Nyní napišme implementaci metody increaseRevenue ve třídě Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Napíšeme implementaci metody:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Ověřme fungování naší třídy:

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

Implementujme metodu increaseRevenue i ve třídě Student. Tentokrát naše metoda bude zvyšovat již stipendium:

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

Přidejte do vaší třídy User stejnou abstraktní metodu increaseRevenue. Napište implementaci této metody ve třídách Employee a Student.

Задание 2

Ve třídě Figure vytvořte abstraktní metody pro získání obsahu a obvodu obrazce.