Наследяване от клас и имплементация на интерфейс в ООП в PHP
Един клас може да наследява от друг клас и в същото време да имплементира някакъв интерфейс. Нека разгледаме с практически пример.
Да приемем, че искаме да създадем клас Programmer,
който има име, заплата и списък с езици,
които програмистът знае.
Засега нашето описание на класа е доста неясно:
да, в класа ще има име, заплата, езици -
но кои методи ще има в нашия клас?
Нека опишем нашия клас по-точно с помощта на
интерфейс iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Да приемем, че разгледахме вече реализираните от нас
класове и се оказва, че вече имаме подобен
клас Employee. Той не имплементира всички
методи на класа Programmer, но част от тях.
Ето кода на вече съществуващия при нас клас:
<?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;
}
}
?>
Логично в нашия случай е да направим така, че
нашият нов клас Programmer да наследи
част от необходимите си методи от класа
Employee (а останалата част ще ги имплементираме
вече в самия нов клас):
<?php
class Programmer extends Employee
{
}
?>
Освен това знаем, че класът Pogrammer
трябва да имплементира интерфейса
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Нека комбинираме наследяването от клас
Employee и имплементацията на интерфейса
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Така ще се получи, че нашият клас Pogrammer
ще наследи от класа Employee методите
__construct, getName и getSalary,
а методите addLang и getLangs
ще трябва да ги имплементираме ние:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// имплементация
}
public function getLangs()
{
// имплементация
}
}
?>
На интерфейса iProgrammer не му пука
дали методите са родни за класа или наследени
- важно е всички описани методи да са
имплементирани.
Копирайте кода на моя клас Employee
и кода на интерфейса iProgrammer. Не копирайте
моята заготовка на клас Programmer -
без да надничате в моя код, имплементирайте този
клас самостоятелно.