Arv fra klasse og implementering af interface i OOP i PHP
En klasse kan arve fra en anden klasse og samtidig implementere et interface. Lad os se på et praktisk eksempel.
Lad os sige, at vi vil lave en klasse Programmer,
som har et navn, en løn og en liste over sprog,
som programmøren kan.
Vores beskrivelse af klassen er ret vag indtil videre:
ja, klassen vil have et navn, en løn, sprog -
men hvilke metoder vil vores klasse have?
Lad os beskrive vores klasse mere præcist ved hjælp af
interfacet iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Lad os sige, at vi har gravet i vores allerede implementerede
klasser, og det viser sig, at vi allerede har en lignende
klasse Employee. Den implementerer ikke alle
metoderne fra klassen Programmer, men en del.
Her er koden for den klasse, vi allerede 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 er logisk i vores tilfælde at gøre sådan, at
vores nye klasse Programmer arver
de nødvendige metoder fra klassen
Employee (og resten implementerer vi
så i den nye klasse senere):
<?php
class Programmer extends Employee
{
}
?>
Samtidig ved vi, at klassen Pogrammer
skal implementere interfacet
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Lad os kombinere arv fra klassen
Employee og implementering af interfacet
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Resultatet bliver, at vores klasse Pogrammer
vil arve fra klassen Employee metoderne
__construct, getName og getSalary,
mens metoderne addLang og getLangs
bliver vi nødt til at implementere selv:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementering
}
public function getLangs()
{
// implementering
}
}
?>
Interfacet iProgrammer er ligeglad med,
om metoderne er oprindelige i klassen eller arvede
- det vigtigste er, at alle de beskrevne metoder er
implementeret.
Kopiér koden for min klasse Employee
og koden for interfacet iProgrammer. Kopiér ikke
min skabelon for klassen Programmer -
implementer denne klasse selv uden at kigge på min kode.