Overerving van klasse en implementatie van interface in OOP in PHP
Een klasse kan overerven van een andere klasse en tegelijkertijd een interface implementeren. Laten we dit bekijken met een praktisch voorbeeld.
Stel we willen een klasse Programmer maken,
die een naam, salaris en een lijst met talen heeft
die de programmeur beheerst.
Onze beschrijving van de klasse is nogal vaag:
ja, de klasse heeft een naam, salaris, talen -
maar welke methodes zal onze klasse hebben?
Laten we onze klasse nauwkeuriger beschrijven met behulp van
de interface iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Stel we hebben ons reeds geïmplementeerde
klassen bekeken en het blijkt dat we al een vergelijkbare
klasse Employee hebben. Hij implementeert niet alle
methodes van de klasse Programmer, maar wel een deel.
Hier is de code van onze reeds bestaande klasse:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Het is logisch in ons geval om ervoor te zorgen dat
onze nieuwe klasse Programmer een deel van de
nodige methodes erft van de klasse
Employee (en een deel zullen we later implementeren
in de nieuwe klasse zelf):
<?php
class Programmer extends Employee
{
}
?>
Tegelijkertijd weten we dat de klasse Programmer
de interface iProgrammer moet implementeren:
<?php
class Programmer implements iProgrammer
{
}
?>
Laten we overerving van de klasse
Employee en implementatie van de interface
iProgrammer combineren:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Het resultaat is dat onze klasse Programmer
de methodes __construct, getName en getSalary
zal erven van de klasse Employee,
en de methodes addLang en getLangs
zullen we zelf moeten implementeren:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementatie
}
public function getLangs()
{
// implementatie
}
}
?>
De interface iProgrammer maakt het niet uit
of de methodes eigen zijn aan de klasse of geërfd -
het belangrijkste is dat alle beschreven methodes
geïmplementeerd zijn.
Kopieer de code van mijn klasse Employee
en de code van de interface iProgrammer. Kopieer niet
mijn opzet voor de klasse Programmer -
implementeer deze klasse zelfstandig zonder
in mijn code te spieken.