Nạp chồng phương thức là một khái niệm trong OOP nơi tồn tại nhiều phương thức cùng tên trong một lớp chấp nhận một số lượng tham số hoặc kiểu dữ liệu khác nhau. Ví dụ, một phương thức add() có thể được nạp chồng bằng cách định nghĩa nó hai lần;
Chúng ta thậm chí có thể quá tải hàm bằng cách cung cấp các đối số nguyên trong một phương thức trong khi cung cấp các đối số dấu phẩy động trong phương thức kia. Kiểu nạp chồng này phổ biến trong các ngôn ngữ như Java và C++
Tuy nhiên, khái niệm nạp chồng phương thức khá khác trong PHP. Quá tải phương thức là quá trình tạo động một phương thức với sự trợ giúp của các phương thức ma thuật
Chúng ta có thể tạo các phương thức không tồn tại trong phạm vi của một lớp. Nó hoạt động cho cả phương thức lớp và phương thức tĩnh
Các phương thức ma thuật __call() và __callStatic() được sử dụng để làm quá tải các phương thức động. Rõ ràng từ cái tên mà phương thức __call() được sử dụng cho các phương thức lớp và phương thức callStatic() được sử dụng cho các phương thức tĩnh
Cú pháp của các phương thức này được hiển thị bên dưới
__call($name, $arguments){ //function body }
Ở đây, ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
0 là tên của phương thức động và ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
1 là một mảng chứa các đối số của phương thức động. Bên trong phương thức, chúng ta có thể truy cập các đối số bằng cách sử dụng các chỉ số trong mảng ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
1
Sử dụng Phương thức ma thuật __call() để triển khai quá tải phương thức trong PHP
Chúng ta có thể sử dụng phương thức __call() để tạo một phương thức động trong PHP. Phương thức sẽ được thực thi khi chúng ta gọi một phương thức chưa được tạo trong ngữ cảnh đối tượng
Quá trình này được gọi là nạp chồng phương thức trong PHP
Ví dụ: tạo một lớp ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
5 và phương thức __call() bên trong nó. Đặt tên cho các tham số ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
0 và ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
1 trong phương thức này
Bên trong phương thức, in biến ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
0 và các phần tử của mảng ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
1. Bên ngoài lớp, tạo một đối tượng inside the method: student_info
id:1
name:Biswash
1 của lớp ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
5
Tiếp theo, gọi phương thức inside the method: student_info id:1 name:Biswash 3 với đối tượng inside the method: student_info id:1 name:Biswash 1. Truyền các đối số inside the method: student_info id:1 name:Biswash 5 và inside the method: student_info id:1 name:Biswash 6 trong phương thức
Mã ví dụ
";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
Hãy hiểu quy trình của ví dụ trên
Khi chúng ta gọi phương thức inside the method: student_info
id:1
name:Biswash
3 với các tham số, chương trình không tìm thấy phương thức đó trong lớp ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
5. Tuy nhiên, phương thức __call() tồn tại trong lớp, vì vậy chức năng này được thực thi
Tham số ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
0 trong phương thức giữ phương thức inside the method: student_info
id:1
name:Biswash
3 và tham số ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
1 giữ các đối số inside the method: student_info
id:1
name:Biswash
5 và inside the method: student_info
id:1
name:Biswash
6 là ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
University::professor_info(0010,'Professor Jack ');
?>
5. Các tham số được in bên trong phương thức __call()
đầu ra
inside the method: student_info id:1 name:Biswash
Theo cách này, chúng ta có thể sử dụng phương thức ma thuật __call() để nạp chồng phương thức trong ngữ cảnh đối tượng trong PHP
Sử dụng Phương thức ma thuật __callStatic() để triển khai quá tải phương thức trong PHP
Chúng ta cũng có thể sử dụng tính năng nạp chồng phương thức trong ngữ cảnh tĩnh trong PHP. Chúng ta phải sử dụng phương pháp ma thuật __callStatic()
Định nghĩa hàm của phương thức tương tự như định nghĩa của phương thức inside the method: professor_info id:8 name:Professor Jack 0. Tuy nhiên, khi chúng ta sử dụng nó trong ngữ cảnh tĩnh, phương thức phải là tĩnh
Vì là ngữ cảnh tĩnh nên chúng ta không cần tạo thể hiện của lớp. Chúng ta có thể gọi trực tiếp phương thức được tạo động bằng cách sử dụng toán tử inside the method: professor_info id:8 name:Professor Jack 1 từ lớp
Ví dụ, tạo một phương thức __callStatic() bên trong lớp ";
echo "id:".$arguments[0]."
";
echo "name:".$arguments[1]."
";
}
}
$student = new University;
$student->student_info(001,'Biswash');
?>
5 như chúng ta đã làm với phương thức __call(). Đừng quên viết từ khóa inside the method: professor_info
id:8
name:Professor Jack
5 trong khi xác định phương thức
Điền các tham số và phần thân của phương thức như trong phương thức trên. Bên ngoài lớp, gọi một phương thức inside the method: professor_info id:8 name:Professor Jack 6 bằng cách sử dụng toán tử inside the method: professor_info id:8 name:Professor Jack 1 bởi lớp là inside the method: professor_info id:8 name:Professor Jack 8