Apstraktne metode u OOP-u u PHP-u

Apstraktne klase takođe mogu sadržati apstraktne metode. Takve metode ne bi trebalo da imaju implementaciju, već služe da naznače da takve metode moraju postojati kod naslednika. A sama implementacija tih metoda - već je zadatak naslednika.

Da bi se metoda deklarisala kao apstraktna, pri njenoj deklaraciji treba napisati ključnu reč abstract.

Hajde da probamo u praksi. Pretpostavimo, da svi naslednici klase User treba da imaju metodu increaseRevenue.

Ova metoda treba da uzme trenutni prihod korisnika i da ga poveća za određenu vrednost, proslednu kao parametar.

Sama klasa User ne zna, kakav tačno prihod će naslednik imati - jer kod zaposlenog to je plata, a kod studenta - stipendija. Zato će svaki naslednik implementirati ovu metodu na svoj način.

Suština je u tome što apstraktna metoda klase User primorava programera da implementira ovu metodu u naslednicima, inače će PHP prijaviti grešku. Tako vi, ili drugi programer, koji radi sa vašim kodom, nikako nećete moći da zaboravite da implementirate potrebnu metodu u nasledniku.

Dakle, hajde da probamo u praksi. Dodajmo apstraktnu metodu increaseRevenue u klasu User:

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

Neka naša klasa Employee za sada ostane bez izmena. U ovom slučaju, čak i ako ne kreiramo objekat klase Employee, već samo pokrenemo kod u kojem se definišu naše klase, - PHP će prijaviti grešku.

Sada hajde da napišemo implementaciju metode increaseRevenue u klasi Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Napišimo implementaciju metode:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Proverimo rad naše klase:

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

Implementirajmo metodu increaseRevenue i u klasi Student. Samo što će sada naša metoda povećavati već stipendiju:

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

Dodajte u vašu klasu User istu apstraktnu metodu increaseRevenue. Napišite implementaciju ove metode u klasama Employee i Student.

Задание 2

U klasi Figure napravite apstraktne metode za dobijanje površine i obima figure.