Arv från klass och implementering av gränssnitt i OOP i PHP
En klass kan ärva från en annan klass och samtidigt implementera ett gränssnitt. Låt oss titta på ett praktiskt exempel.
Låt oss säga att vi vill skapa en klass Programmer,
som har ett namn, en lön och en lista över språk
som programmeraren kan.
Vår beskrivning av klassen är ganska vag för tillfället:
ja, klassen kommer att ha namn, lön, språk -
men vilka metoder kommer vår klass att ha?
Låt oss beskriva vår klass mer exakt med hjälp av
gränssnittet iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Låt oss säga att vi grävt i våra redan implementerade
klasser och det visar sig att vi redan har en liknande
klass Employee. Den implementerar inte alla
metoder från klassen Programmer, men en del.
Här är koden för klassen som vi redan har:
<?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;
}
}
?>
Det är logiskt i vårt fall att göra så att
vår nya klass Programmer ärver
en del av de metoder den behöver från klassen
Employee (och en del kommer vi sedan att implementera
i den nya klassen själva):
<?php
class Programmer extends Employee
{
}
?>
Samtidigt vet vi att klassen Pogrammer
bör implementera gränssnittet
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Låt oss kombinera arv från klassen
Employee och implementering av gränssnittet
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Resultatet blir att vår klass Pogrammer
kommer att ärva från klassen Employee metoderna
__construct, getName och getSalary,
medan metoderna addLang och getLangs
måste vi implementera själva:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementering
}
public function getLangs()
{
// implementering
}
}
?>
Gränssnittet iProgrammer bryr sig inte om
huruvida metoderna är egna i klassen eller ärvda
- huvudsaken är att alla beskrivna metoder är
implementerade.
Kopiera koden för min klass Employee
och koden för gränssnittet iProgrammer. Kopiera inte
min förberedelse för klassen Programmer -
implementera denna klass själv utan att titta på min kod.