Arv fra klasse og implementering av grensesnitt i OOP i PHP
En klasse kan arve fra en annen klasse og samtidig implementere et grensesnitt. La oss se på et praktisk eksempel.
La oss si at vi ønsker å lage en klasse Programmerer,
som har et navn, lønn og en liste over språk
som programmereren kan.
Foreløpig er beskrivelsen av klassen ganske vag:
ja, klassen vil ha navn, lønn, språk -
men hvilke metoder vil klassen vår ha?
La oss beskrive klassen vår mer nøyaktig ved hjelp av
grensesnittet iProgrammerer:
<?php
interface iProgrammerer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
La oss si at vi gravde i de allerede implementerte
klassene våre og det viser seg at vi allerede har en lignende
klasse Ansatt. Den implementerer ikke alle
metodene til klassen Programmerer, men en del.
Her er koden til klassen som allerede eksisterer hos oss:
<?php
class Ansatt
{
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 vårt tilfelle å gjøre slik at
vår nye klasse Programmerer arver
delen av de nødvendige metodene fra klassen
Ansatt (og resten implementerer vi
så i den nye klassen):
<?php
class Programmerer extends Ansatt
{
}
?>
Samtidig vet vi at klassen Programmerer
skal implementere grensesnittet
iProgrammerer:
<?php
class Programmerer implements iProgrammerer
{
}
?>
La oss kombinere arv fra klassen
Ansatt og implementering av grensesnittet
iProgrammerer:
<?php
class Programmerer extends Ansatt implements iProgrammerer
{
}
?>
Det vil si at klassen vår Programmerer
vil arve fra klassen Ansatt metodene
__construct, getName og getSalary,
mens metodene addLang og getLangs
må vi implementere:
<?php
class Programmerer extends Ansatt implements iProgrammerer
{
public function addLang($lang)
{
// implementering
}
public function getLangs()
{
// implementering
}
}
?>
Grensesnittet iProgrammerer bryr seg ikke om
metodene er opprinnelige i klassen eller arvede
- det viktigste er at alle de beskrevne metodene er
implementert.
Kopier koden til klassen min Ansatt
og koden til grensesnittet iProgrammerer. Ikke kopier
mitt utkast til klassen Programmerer -
implementer denne klassen på egen hånd uten å kikke på koden min.