Kế thừa từ lớp và triển khai giao diện trong OOP PHP
Một lớp có thể kế thừa từ một lớp khác và đồng thời triển khai một giao diện nào đó. Hãy xem xét một ví dụ thực tế.
Giả sử chúng ta muốn tạo một lớp Programmer,
mà nó sẽ có tên, lương và danh sách các ngôn ngữ
mà lập trình viên biết.
Hiện tại mô tả lớp của chúng ta khá mơ hồ:
vâng, trong lớp sẽ có tên, lương, ngôn ngữ -
nhưng những phương thức nào sẽ có trong lớp của chúng ta?
Hãy mô tả lớp của chúng ta một cách chính xác hơn bằng cách sử dụng
giao diện iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Giả sử chúng ta đào sâu vào các lớp đã được triển khai
của chúng ta và, hóa ra, chúng ta đã có một lớp tương tự
là Employee. Nó không triển khai tất cả
các phương thức của lớp Programmer, nhưng là một phần.
Đây là mã của lớp đã tồn tại của chúng ta:
<?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;
}
}
?>
Hợp lý trong trường hợp của chúng ta là làm sao để
lớp mới Programmer của chúng ta kế thừa
một phần các phương thức cần thiết cho chính nó từ lớp
Employee (và phần còn lại chúng ta sẽ triển khai
ngay trong chính lớp mới):
<?php
class Programmer extends Employee
{
}
?>
Đồng thời chúng ta biết rằng lớp Pogrammer
phải triển khai giao diện
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
Hãy kết hợp việc kế thừa từ lớp
Employee và việc triển khai giao diện
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Kết quả là lớp Pogrammer của chúng ta
sẽ kế thừa từ lớp Employee các phương thức
__construct, getName và getSalary,
còn các phương thức addLang và getLangs
chúng ta sẽ phải tự triển khai:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// triển khai
}
public function getLangs()
{
// triển khai
}
}
?>
Giao diện iProgrammer không quan tâm,
các phương thức là gốc của lớp hay được kế thừa
- điều chính là tất cả các phương thức được mô tả phải được
triển khai.
Hãy sao chép mã lớp Employee của tôi
và mã giao diện iProgrammer. Đừng sao chép
phần khung lớp Programmer của tôi -
hãy tự mình triển khai lớp này mà không nhìn vào
mã của tôi.