Metody abstrakcyjne w OOP w PHP

Klasy abstrakcyjne mogą również zawierać metody abstrakcyjne. Takie metody nie powinny mieć implementacji, a są potrzebne do wskazania, że takie metody powinny być u potomków. A właściwa implementacja takich metod - to już zadanie potomków.

Aby zadeklarować metodę jako abstrakcyjną, przy jej deklaracji należy napisać słowo kluczowe abstract.

Spróbujmy w praktyce. Załóżmy, że zakłada się, iż wszyscy potomkowie klasy User powinni mieć metodę increaseRevenue.

Ta metoda powinna brać bieżący dochód użytkownika i zwiększać go o pewną wartość, przekazaną parametrem.

Sama klasa User nie wie, jaki dokładnie dochód będzie miał potomek - przecież u pracownika to wynagrodzenie, a u studenta - stypendium. Dlatego każdy potomek będzie implementował tę metodę na swój sposób.

Sedno sprawy jest takie, że metoda abstrakcyjna klasy User zmusza programistę do zaimplementowania tej metody u potomków, inaczej PHP zwróci błąd. W ten sposób ty, lub inny programista, pracujący z twoim kodem, w żaden sposób nie będzie mógł zapomnieć o zaimplementowaniu potrzebnej metody u potomka.

Zatem, spróbujmy w praktyce. Dodajmy metodę abstrakcyjną increaseRevenue do klasy User:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Metoda abstrakcyjna bez ciała:
    abstract public function increaseRevenue($value);
  }
?>

Niech nasza klasa Employee na razie pozostanie bez zmian. W tym przypadku, nawet jeśli nie tworzyć obiektu klasy Employee, a po prostu uruchomić kod, w którym definiowane są nasze klasy, - PHP zwróci błąd.

Teraz napiszmy implementację metody increaseRevenue w klasie Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Napiszmy implementację metody:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Sprawdźmy działanie naszej klasy:

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

Zaimplementujmy metodę increaseRevenue i w klasie Student. Tylko teraz nasza metoda będzie zwiększać już stypendium:

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

Dodaj do swojej klasy User taką samą metodę abstrakcyjną increaseRevenue. Napisz implementację tej metody w klasach Employee i Student.

Задание 2

W klasie Figure zrób abstrakcyjne metody do uzyskiwania pola i obwodu figury.