Ereditarietà dalla classe e implementazione dell'interfaccia in OOP in PHP
Una classe può ereditare da un'altra classe e allo stesso tempo implementare un'interfaccia. Consideriamo un esempio pratico.
Supponiamo di voler creare una classe Programmer,
che abbia un nome, uno stipendio e un elenco di linguaggi
che il programmatore conosce.
Per ora la descrizione della nostra classe è piuttosto vaga:
sì, nella classe ci saranno nome, stipendio, linguaggi -
ma quali metodi avrà la nostra classe?
Descriviamo la nostra classe in modo più preciso utilizzando
l'interfaccia iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Supponiamo di aver setacciato le classi già implementate da noi
e, a quanto pare, abbiamo già una classe simile
Employee. Essa non implementa tutti
i metodi della classe Programmer, ma solo una parte.
Ecco il codice della classe già esistente in nostro possesso:
<?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;
}
}
?>
È logico nel nostro caso fare in modo che
la nostra nuova classe Programmer erediti
parte dei metodi necessari dalla classe
Employee (e la parte restante la implementeremo
poi nella nuova classe stessa):
<?php
class Programmer extends Employee
{
}
?>
Allo stesso tempo, sappiamo che la classe Pogrammer
deve implementare l'interfaccia
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Uniamo l'ereditarietà dalla classe
Employee e l'implementazione dell'interfaccia
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Risulterà che la nostra classe Pogrammer
erediterà dalla classe Employee i metodi
__construct, getName e getSalary,
while i metodi addLang e getLangs
dovremo implementarli noi:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementazione
}
public function getLangs()
{
// implementazione
}
}
?>
All'interfaccia iProgrammer non importa,
se i metodi sono nativi della classe o ereditati
- l'importante è che tutti i metodi descritti siano
implementati.
Copiate il codice della mia classe Employee
e il codice dell'interfaccia iProgrammer. Non copiate
la mia bozza della classe Programmer -
senza sbirciare il mio codice, implementate questa
classe autonomamente.