Abstracte methoden in OOP in PHP
Abstracte klassen kunnen ook abstracte methoden bevatten. Dergelijke methoden moeten geen implementatie hebben, maar zijn nodig om aan te geven dat dergelijke methoden bij afstammelingen moeten zijn. En de daadwerkelijke implementatie van dergelijke methoden is al de taak van de afstammelingen.
Om een methode abstract te declareren,
moet bij de declaratie het sleutelwoord
abstract worden geschreven.
Laten we het in de praktijk proberen. Stel dat wordt verondersteld
dat alle afstammelingen van de klasse User
de methode increaseRevenue moeten hebben.
Deze methode moet het huidige inkomen van de gebruiker nemen en het verhogen met een bepaalde waarde, doorgegeven als parameter.
De klasse User zelf weet niet welk specifiek
inkomen de erfgenaam zal krijgen - voor een werknemer
is het salaris, en voor een student - een beurs. Daarom
zal elke afstammeling deze methode implementeren
op zijn eigen manier.
Het punt hier is dat de abstracte methode van de klasse
User de programmeur dwingt om
deze methode in afstammelingen te implementeren, anders geeft PHP een foutmelding.
Op deze manier kun jij, of een andere programmeur
die met jouw code werkt, onmogelijk
vergeten om de vereiste methode te implementeren
in een afstammeling.
Laten we het in de praktijk proberen. Laten we
een abstracte methode increaseRevenue toevoegen
aan de klasse User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstracte methode zonder body:
abstract public function increaseRevenue($value);
}
?>
Laten we onze klasse Employee voorlopig
onveranderd laten. In dit geval, zelfs als er geen
object van de klasse Employee wordt gemaakt,
maar simpelweg de code wordt uitgevoerd waarin onze
klassen worden gedefinieerd - zal PHP een foutmelding geven.
Laten we nu de implementatie van de methode
increaseRevenue schrijven in de klasse
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Schrijven we de implementatie van de methode:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Laten we de werking van onze klasse testen:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Laten we de methode increaseRevenue ook implementeren
in de klasse Student. Alleen zal onze
methode nu de beurs verhogen:
<?php
class Student extends User
{
private $scholarship; // beurs
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Methode verhoogt de beurs:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Voeg dezelfde abstracte methode increaseRevenue toe
aan je klasse User.
Schrijf de implementatie van deze methode in de klassen
Employee en Student.
Maak in de klasse Figure abstracte
methoden voor het verkrijgen van de oppervlakte en omtrek van de figuur.