Overwrite và overload oop php

Overloading (Nạp chồng phương thức) và Overriding (ghi đè phương thức) là hai khái niệm cơ bản trong lập trình mà bất kì newbie nào cũng cần phân biệt. Vậy chúng là gì? Khác nhau thế nào? Hãy cùng mình phân tích và tìm hiểu nhé.

Bạn đang xem: Override và overload trong php

Overloading (Nạp chồng phương thức) là gì?

Overloading là một kĩ thuật cho phép trong cùng một class có thể có nhiều phương thức cùng tên nhưng khác nhau về số lượng tham số hoặc kiểu dữ liệu tham số. Ví dụ chúng ta có hàm tinhTong dùng để cộng hai số nguyên. Khi muốn cộng ba số nguyên không lẽ tôi lại phải viết một hàm với tên khác(chẳng hạn tinhTong1) và truyền vào 3 số nguyên hay sao? Như vậy thì code sẽ trở nên phức tạp hơn trong khi hai hàm có cùng một mục đích là cộng các số nguyên lại với nhau. Như vậy chúng ta sẽ overload hàm tinhTong như sau:

Overwrite và overload oop php

Khi gọi hàm tinhTong và truyền vào số lượng tham số khác nhau thì sẽ gọi tới hàm có số lượng tham số tương ứng

Overwrite và overload oop php

Chú ý vào cửa sổ "Watch 1" ta thấy giá trị của hai biến a và b lần lượt là giá trị trả về của hai hàm tinhTong(int a, int b) và hàm tinhTong(int a, int b, int c)

Tương tự chứ ta có thể overload kiểu dữ liệu của tham số. Thay vì hàm tinhTongcộng hai số nguyên thì tôi cũng có thể cộng hai số thực, chỉ cần truyền vào 2 tham số kiểu double.

Overwrite và overload oop php

Tương tự giá trị biến c là giá trị trả về của hàm tinhTong(double a, double b) sau khi truyền vào hai tham số kiểu double.

Xem thêm: Bí Quyết Vịt Nướng Vân Đình Công Thức Chuẩn Ngon, Hướng Dẫn Làm Vịt Nướng Vân Đình Thơm Nứt Mũi

Overwrite và overload oop php

Tạo constructor với số lượng tham số khác nhau cũng là một dạng của oveloading.

Overriding (Ghi đè phương thức) là gì?

Overrding (tên đầy đủ là Method Overriding), được sử dụng trong trường hợp lớp con kế thừa từ lớp cha và muốn định nghĩa lại một phương thức đã có mặt ở lớp cha. Một lớp cha thông thường có thể có nhiều lớp con kế thừa, tuy nhiên phương thức ở lớp cha có thể phù hợp với lớp con này nhưng không phù hợp với lớp con khác, do đó lớp con cần ghi đè lại phương thức đó cho phù hợp. Ví dụ class Animal có phương thức animalSound đại diện cho tiếng kêu của động vật. Class Dog và Cat kế thừa từ class Animal, nhưng chó và mèo có tiếng kêu khác nhau nên phải implement phương thức animalSound cho mỗi lớp khác nhau. Vì vậy cần phải ghi đè lại phương thức animalSound ở hai lớp Dog và Cat bằng cách sử dụng từ khóa override như sau(lưu ý ví dụ minh họa sử dụng code C#, những ngôn ngữ khác nhau sẽ overriding theo cú pháp khác nhau nhưng về bản chất là như nhau).

Overwrite và overload oop php

Ở hàm main tạo instance của class Animal, Dog và Cat sẽ cho kết quả như sau.

Overwrite và overload oop php

=> Kết quả

Overwrite và overload oop php

So sánh

Overloading Overriding
Thể hiện đa hình tại compile time Thể hiện đa hình tại runtime
Thêm hành vi cho phương thức Thay đổi hành vi hiện tại của phương thức
Có thể khác nhau về số lượng và kiểu dữ liệu của tham số Số lượng và kiểu dữ liệu của tham số phải giống nhau
Xảy ra trong cùng một class Xảy ra ở 2 class có quan hệ kế thừa

Hi vọng qua bài viết này anh em sẽ hiểu rõ hơn và không còn nhầm lẫn giữa hai khái niệm này nữa. Thanks ~

  • How to get a random array element in php · github
  • Php array check if all values are unique code example
  • Json to php using json_decode
  • Grid: php 5, media temple software versions

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ụ