Ngôn ngữ PHP – Kế thừa

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ụ