Dziedziczenie po klasie i implementacja interfejsu w OOP w PHP
Klasa może dziedziczyć po innej klasie i jednocześnie implementować jakiś interfejs. Rozważmy na praktycznym przykładzie.
Załóżmy, że chcemy utworzyć klasę Programmer,
która będzie miała imię, wynagrodzenie i listę języków,
które programista zna.
Na razie nasz opis klasy jest dość rozmyty:
tak, w klasie będzie imię, wynagrodzenie, języki -
ale jakie metody będą w naszej klasie?
Opiszmy naszą klasę dokładniej za pomocą
interfejsu iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Załóżmy, że przejrzeliśmy już przez zaimplementowane przez nas
klasy i, okazuje się, że mamy już podobną
klasę Employee. Nie implementuje ona wszystkich
metod klasy Programmer, ale część.
Oto kod już istniejącej u nas klasy:
<?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;
}
}
?>
Logiczne w naszym przypadku jest, aby
nasza nowa klasa Programmer odziedziczyła
część potrzebnych sobie metod po klasie
Employee (a część zaimplementujemy
później już w samej nowej klasie):
<?php
class Programmer extends Employee
{
}
?>
Przy tym wiemy, że klasa Pogrammer
powinna implementować interfejs
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Połączmy dziedziczenie po klasie
Employee i implementację interfejsu
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Okaże się, że nasza klasa Pogrammer
odziedziczy po klasie Employee metody
__construct, getName i getSalary,
a metody addLang i getLangs
będziemy musieli zaimplementować:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// implementacja
}
public function getLangs()
{
// implementacja
}
}
?>
Dla interfejsu iProgrammer nie ma znaczenia,
czy metody są natywne dla klasy, czy odziedziczone
- główne, aby wszystkie opisane metody były
zaimplementowane.
Skopiuj kod mojej klasy Employee
i kod interfejsu iProgrammer. Nie kopiuj
mojego szablonu klasy Programmer -
nie podglądając w mój kod zaimplementuj tę
klasę samodzielnie.