Hướng dẫn php inheritance override method - phương pháp ghi đè thừa kế 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 đó. 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 đó.
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++

<?php
class Person 
{
	const salary = 100000;
	
	
	function caculateSalary()
	{
		return $salary;
	}	
	function caculateSalary($hour=0)
	{
		return $salary*$hour;
	}
  } 
$per = new Person();
$per->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 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 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ụ:

<?php
class Person 
{
	const salary = 100000;
	
	public function __construct()
	{
	//Your logic for constructor
	}
  function __call($nameMethod,$hour){
    if($nameMethod == 'caculateSalary')// Tên phương khi gọi
        switch(count($hour))
	{
            case 0 : return self::salary ;	// Không truyền tham số cho hàm		
            case 1 : return self::salary * $hour[0] ;//Truyền 1 tham số
            
        }
    }
 
} 
 $per = new Person();
 echo "".$per->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.

  • 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++

Ví dụ:

<?php
class Person 
{
		private $fullName;
		private $address;
		private $phone;
		private $email;
		//override trong lớp con
		function caculationSalary()
		{
			return 0;
		}
		function Person($fullName, $address, $phone, $email)
		{
			$this->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."<br>";
			echo "Địa chỉ: ".$this->address."<br>";
			echo "Điện thoại: ".$this->phone."<br>";
			echo "Email: ".$this->email."<br>";
		}
} 
	
	
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 "<br> 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 "<h2>Danh sách nhân viên</h2><hr/>";
 foreach($per as $pers)
 {
   $pers->showInfo();
   echo "Tiền lương là:".$pers->caculationSalary();
   echo "<hr/>";
 }
  
?>

Xem ví dụ