Moștenirea de la o clasă și implementarea unei interfețe în OOP în PHP
O clasă poate moșteni de la o altă clasă și în același timp poate implementa o interfață. Să analizăm un exemplu practic.
Să presupunem că vrem să creăm o clasă Programmer,
care să aibă un nume, un salariu și o listă de limbaje,
pe care le cunoaște programatorul.
Descrierea clasei noastre este încă foarte vagă:
da, în clasă vor fi numele, salariul, limbajele -
dar ce metode vor fi în clasa noastră?
Să descriem clasa noastră mai precis cu ajutorul
interfeței iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Să presupunem că am căutat printre clasele
deja implementate de noi și, se pare, avem deja o clasă
similară Employee. Ea nu implementează toate
metodele clasei Programmer, dar o parte.
Iată codul clasei noastre deja existente:
<?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;
}
}
?>
Este logic în cazul nostru să facem astfel încât
noua noastră clasă Programmer să moștenească
o parte din metodele necesare de la clasa
Employee (iar o parte o vom implementa
ulterior în noua clasă):
<?php
class Programmer extends Employee
{
}
?>
În același timp, știm că clasa Pogrammer
trebuie să implementeze interfața
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Să combinăm moștenirea de la clasa
Employee și implementarea interfeței
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Se va dovedi că clasa noastră Pogrammer
va moșteni de la clasa Employee metodele
__construct, getName și getSalary,
iar metodele addLang și getLangs
va trebui să le implementăm noi:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementare
}
public function getLangs()
{
// implementare
}
}
?>
Interfeței iProgrammer nu îi pasă,
metodele sunt native pentru clasă sau moștenite
- principalul este ca toate metodele descrise să fie
implementate.
Copiați codul clasei mele Employee
și codul interfeței iProgrammer. Nu copiați
schița mea a clasei Programmer -
fără să vă uitați la codul meu, implementați această
clasă independent.