Kế thừa trong php là gì?
Kế thừa trong php được hiểu là class này có thể sử dụng lại các thuộc tính, phương thức của class khác mà không cần viết lại từ đầu. Mỗi thuộc tính, phương thức chỉ cần viết một lần duy nhất và có thể chia sẻ thông tin với class khác nhờ sự kế thừa.
Class cho các class khác kế thừa được gọi là class cha, class được kế thừa gọi là class con. Ngôn ngữ PHP cho phép đa kế thừa, tức là class A có thể kế thừa từ class B, class B có thể kế thừa từ class C….
Khi class A kế thừa từ class B, class A sẽ có tất cả các thuộc tính, phương thức của class B, ngoài ra class A còn có thể có các phương thức, thuộc tính mới hoặc loại bỏ đi một số thuộc tính, phương thức của class B. Tôi gọi đây là kế thừa có chọn lọc. Class A chỉ lấy những cái mình cần từ class B, và tạo nên các thuộc tính mới, phương thức mới, thể hiện cá tính và chức năng của mình.
Trong PHP để khai báo kế thừa từ một lớp cha chúng ta sử dụng từ khóa extends theo cú pháp:
class childClass extends parentClass
{
//code
}
Trong đó: childClass là class mà các bạn đang muốn khởi tạo, parentClass là class cha mà childClass đang muốn kế thừa nó.
Để làm rõ hơn câu trả lời này thì ta sét một ví dụ:
Tôi có 2 đối tượng nhân viên và khách hàng có các thuộc tính và phương thức như hình sau:
Ta tiến hành xây dựng hai Class gồm các thuộc tính & phương thức cho hai đối tượng này như sau:
Class Employee (Nhân Viên)
<?php
class Employee
{
private $fullName;
private $address;
private $phone;
private $email;
private $certificate;// bằng cấp
public function inputInfo()
{
// code here
}
public function showInfo()
{
// code here
}
}
?>
Class Customer (Khách hàng)
<?php
class Customer
{
private $fullName;
private $address;
private $phone;
private $email;
private $kind;// Loại khách hàng
public function inputInfo()
{
// code here
}
public function showInfo()
{
// code here
}
}
?>
-
Cả hai lớp có những đặc điểm chung tên, địa chỉ, email, số điện thoại
-
Cả hai lớp đều có xử lý nhập và hiển thị tên, địa chỉ, email, số điện thoại
Vì thế lập trình hướng đối tượng cung cấp chúng ta một tính chất để giải quyết vấn đề này đó là tính kế thừa.
Ta định nghĩa một đối tượng cha Person có những thuộc tính & phương thức chung trong hai đối tượng trên. Và hai đối tượng Employee & Customer sẽ kế thừa từ đối tượng Person và hai đối tượng đó cũng có thuộc tính & phương thức của riêng nó.
Hình mô tả đối tượng
Chú ý:
Dưới phần code cho phân tích trên:
<?php
class Person
{
protected $fullName;
protected $address;
protected $phone;
protected $email;
function Person($fullName, $address, $phone, $email)
{
$this->fullName = $fullName;
$this->address = $address;
$this->phone = $phone;
$this->email = $email;
}
function inputInfo()
{
$this->fullName = "Thích Học Lại";
$this->address = "Sao Hỏa";
$this->phone = "XXX898800000";
$this->email = "[email protected]";
}
function showInfo()
{
echo "Họ và Tên:".$this->fullName."<br>";
echo "Địa chỉ: ".$this->address."<br>";
echo "Điện thoại".$this->phone."<br>";
echo "Email ".$this->email."<br>";
}
}
class Employee extends Person
{
private $certificate;// bằng cấp
// Phương thức thiết lập không tham số
function __construct ()
{
}
// Phương thức thiết lập
function Employee($fullName, $address, $phone, $email, $certificate)
{
// code
}
function inputInfo()
{
// cod
}
function showInfo()
{
// code
}
}
class Customer extends Person
{
private $kind;// Loại khách hàng
// Phương thức thiết lập không tham số
function __construct ()
{
}
function Customer($fullName, $address, $phone, $email, $kind)
{
//code
}
function inputInfo()
{
//code
}
function showInfo()
{
//code
}
}
?>
2. Truy xuất phương thức và thuộc tính của lớp cha
Sau khi kế thừa thì lớp con sẽ có những thuộc tính & phương thức của lớp cha, vậy làm thế nào để lớp con có thể truy xuất đến những thuộc tính & phương thức đó? Ta sẽ tìm hiểu thông qua hai cách gọi đó là gọi từ bên trong lớp con & gọi từ bên ngoài lớp.
2.1 Gọi bên trong lớp con
Như khái niệm tính kế thừa, lớp con kế thừa từ lớp cha nên tất cả các phương thức và thuộc tính đều coi như là của nó (coi như chứ không phải là của nó hẳn) nên cách gọi cũng như cách nó gọi các phương thức thuộc tính của nó, đó là từ khóa $this->thuoctinh, $this->phuong_thuc().
Tuy nhiên để phân biệt hàm nào của lớp cha, hàm nào của lớp con người ta hay gọi bằng từ khóa: parent::thuoctinh, parent::phuong_thuc().
<?php
class Person
{
protected $fullName;
protected $address;
protected $phone;
protected $email;
function Person($fullName, $address, $phone, $email)
{
$this->fullName = $fullName;
$this->address = $address;
$this->phone = $phone;
$this->email = $email;
}
function inputInfo()
{
$this->fullName = "Thích Học Lại";
$this->address = "Sao Hỏa";
$this->phone = "XXX898800000";
$this->email = "[email protected]";
}
function showInfo()
{
echo "Họ và Tên:".$this->fullName."<br>";
echo "Địa chỉ: ".$this->address."<br>";
echo "Điện thoại".$this->phone."<br>";
echo "Email ".$this->email."<br>";
}
}
// Lớp Employee kế thừa Person
class Employee extends Person
{
private $certificate;// bằng cấp
// Phương thức thiết lập
function __construct ()
{
}
// phương thức thiết lập có tham số
function Employee($fullName, $address, $phone, $email, $certificate)
{
// Dùng từ khóa Parent truy cập vào phương thức cha
Parent::Person($fullName, $address, $phone, $email);
$this->certificate = $certificate;
}
function inputInfo()
{
// Dùng từ khóa Parent truy cập vào phương thức cha
Parent::inputInfo();
$this->certificate = "Tốt nghiệp trường làng nhàng";
}
function showInfo()
{
// // Dùng từ khóa Parent truy cập vào phương thức cha
Parent::showInfo();
echo "Bằng tốt nghiệp".$this->certificate;
}
}
// Customer kế thừa Person
class Customer extends Person
{
private $kind;// Loại khách hàng
// Phương thức thiết lập không tham số
function __construct ()
{
}
function Customer($fullName, $address, $phone, $email, $kind)
{
// Dùng tên Class giống c++ truy cập vào phương cha
Person::Person($fullName, $address, $phone, $email);
$this->kind =$kind;
}
function inputInfo()
{
// Dùng tên Class giống c++ truy cập vào phương cha
Person::inputInfo();
$this->kind = "Vip";
}
function showInfo()
{
// Dùng tên Class giống c++ truy cập vào phương cha
Person::showInfo();
echo "Khách hàng thuộc loại:".$this->kind;
}
}
$customer = new Customer();
$customer->inputInfo();
$customer->showInfo();
?>
Xem ví dụ
2.2 Gọi từ bên ngoài lớp
Cách gọi cũng như cách 1 của phần gọi bên trong lớp con, tuy nhiên không được sử dụng cách 2 (parent::thuoctinh, parent::phuong_thuc()).
<?php
//Demo Class Employeee
$emp = new Employee("Trần Như Nhau","Sao Kim","YYY9099","[email protected]","Tiểu Học");
$emp->showInfo();
?>
Xem ví dụ