Апстрактне методе у ООП у PHP

Апстрактне класе могу такође садржати апстрактне методе. Такве методе не би требало да имају имплементацију, већ служе да укажу да такве методе морају да имају њихови потомци. А саму имплементацију тих метода - то је већ задатак потомака.

Да би се декларисала метода као апстрактна, приликом њеног декларисања треба написати кључну реч abstract.

Хајде да испробамо у пракси. Претпоставимо, да сви потомци класе User треба да имају методу increaseRevenue.

Ова метода треба да узме тренутни приход корисника и да га увећа за неку вредност, која је прослеђена као параметар.

Сама класа User не зна, који тачно приход ће добијати њен наследник - јер код запосленог то је плата, а код студента - стипендија. Зато ће сваки потомак имплементирати ову методу на свој начин.

Поента је у томе, да апстрактна метода класе User приморава програмера да имплементира ову методу у потомцима, иначе ће PHP приказати грешку. На тај начин ви, или други програмер, који ради са вашим кодом, никако нећете моћи да заборавите да имплементирате потребну методу у потомку.

Дакле, хајде да испробамо у пракси. Додајмо апстрактну методу increaseRevenue у класу User:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Апстрактна метода без тела:
    abstract public function increaseRevenue($value);
  }
?>

Нека наша класа Employee за сада остане непромењена. У овом случају, чак и ако се не креира објекат класе Employee, већ само се покрене код, у коме се дефинишу наше класе, - PHP ће приказати грешку.

Хајде сада да напишемо имплементацију методе increaseRevenue у класи Employee:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Напишимо имплементацију методе:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Проверимо рад наше класе:

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

Имплементирајмо методу increaseRevenue и у класи Student. Само ће сада наша метода увећавати већ стипендију:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // стипендија
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // Метода увећава стипендију:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

Додајте у вашу класу User такође апстрактну методу increaseRevenue. Напишите имплементацију те методе у класама Employee и Student.

Задание 2

У класи Figure направите апстрактне методе за добијање површине и периметра фигуре.