Hướng dẫn dùng overriding oops trong PHP

Trong OOP, overriding và overloading là 2 kỹ thuật giúp tạo nên Tính đa hình (Polymorphism), một trong những sức mạnh của lập trình hướng đối tượng. Bài viết này chúng ta sẽ tìm hiểu về khái niệm, cách dùng và tác dụng của 2 kỹ thuật nêu trên.
Trong phạm vi bài viết này chúng ta chỉ để cập đến 2 kỹ thuật này trong Method. Trong lập trình, chúng ta không thể nào khai báo các function (method) trùng tên, nhưng trong OOP chỉ cần áp dụng hai kỹ thuật này, chúng ta hoàn toàn có thể làm được điều đó.

1. Nạp Chồng (Overloading)

Trong PHP, nếu như người lập trình tạo ra một phương thức trong lớp con có trùng tên với một phương thức đã được tạo ở lớp cha thì đó được gọi là ghi đè phương thức(Method Overriding). Hoặc một cách dễ hiểu hơn như sau.

  • Các phương thức nằm trong cùng 1 lớp , có cùng tên với nhau nhưng có danh sách đối số khác nhau được gọi là các phương thức nạp chồng.
  • Tùy theo ta gọi đối số thế nào mà nó sẽ gọi hàm tương ứng.
  • Nạp chồng là hình thức đa hình (polymorphism) trong quá trình biên dịch (compile time).

Ví dụ: đây cách viết nạp chồng giống c++

caculateSalary();

?>

Khi chạy đoạn code trên sẽ thông báo lỗi sau: Fatal error: Cannot redeclare Person::caculateSalary()
Vậy để giải quyết vấn đề overloading trong PHP hỗ trợ hàm function __call($nameMethod,$args). Hàm này có 2 tham số, tham số đầu tiên tên hàm, tham số thứ 2 các tham số của hàm

Ví dụ:

caculateSalary();			
 $per1 = new Person();
 echo "".$per1->caculateSalary(10);

 ?>

Xem ví dụ

2. Ghi đè (Override)

Trong PHP, nếu như người lập trình tạo ra một phương thức trong lớp con có trùng tên với một phương thức đã được tạo ở lớp cha thì đó được gọi là ghi đè phương thức(Method Overriding). Hoặc một cách dễ hiểu hơn như sau.

  • Là Phương thức đã xuất hiện ở lớp cha và xuất hiện tiếp ở lớp con.
  • Khi đối tượng thuộc lớp con gọi phương thức thì sẽ chọn lựa và chạy theo phương thức trong lớp con.
  • Nếu lớp con không có phương thức đó thì mới lên kiếm ở lớp cha để chạy
  • Ghi đè là hình thức đa hình (polymorphism) trong quá trình thực thi (Runtime)

Ví dụ:

fullName = 	$fullName;
			$this->address	=	$address;
			$this->phone	= 	$phone;
			$this->email	=	$email;
		}
		//override trong lớp con
		function inputInfo()
		{
			$this->fullName = 	"Thích Học Lại";
			$this->address	=	"Sao Hỏa";
			$this->phone	= 	"XXX898800000";
			$this->email	=	"";
		}
		//override trong lớp con
		function showInfo()
		{
			echo "Họ và Tên:".$this->fullName."
"; echo "Địa chỉ: ".$this->address."
"; echo "Điện thoại: ".$this->phone."
"; echo "Email: ".$this->email."
"; } } class Employee extends Person { const price= 5000; private $baseSalary; private $numOfProduct; /*function __construct() { }*/ // phương thức thiết lập có tham số function __construct($fullName, $address, $phone, $email, $baseSalary, $numOfProduct) { // Dùng từ khóa Parent truy cập vào phương thức cha Parent::Person($fullName, $address, $phone, $email); $this->baseSalary = $baseSalary; $this->numOfProduct = $numOfProduct; } function inputInfo() { // Dùng từ khóa Parent truy cập vào phương thức cha Parent::inputInfo(); $this->baseSalary = 1230000; $this->numOfProduct =10; } function showInfo() { // // Dùng từ khóa Parent truy cập vào phương thức cha Parent::showInfo(); echo "Lương cơ bản:".$this->baseSalary; echo "
Số lượng sản phẩm:".$this->numOfProduct; } function caculationSalary() { return $this->baseSalary+$this->numOfProduct*self::price; } } $per[] = new Employee("Trần Văn Lười", "Cung Trăng", "098884", "", "100", "20");; $per[0]->inputInfo(); // nhập nhân vien mới $per[] = new Employee("Trần Văn Lười", "Cung Trăng", "098884", "", "100", "20"); echo "

Danh sách nhân viên


"; foreach($per as $pers) { $pers->showInfo(); echo "Tiền lương là:".$pers->caculationSalary(); echo "
"; } ?>

Xem ví dụ