Ai bảo bạn PHP không hỗ trợ quá tải chức năng? !!!
Trên thực tế PHP không hỗ trợ chức năng nạp chồng, nhưng theo một cách khác. Các tính năng nạp chồng của PHP khác với Java:
Giải thích "quá tải" của PHP khác với hầu hết các ngôn ngữ hướng đối tượng. Quá tải theo truyền thống cung cấp khả năng có nhiều phương thức có cùng tên nhưng số lượng và loại đối số khác nhau.
Kiểm tra các khối mã sau đây.
Hàm tìm tổng của n số:
function findSum() {
$sum = 0;
foreach (func_get_args() as $arg) {
$sum += $arg;
}
return $sum;
}
echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75
Chức năng thêm hai số hoặc nối hai chuỗi:
function add() {
//cross check for exactly two parameters passed
//while calling this function
if (func_num_args() != 2) {
trigger_error('Expecting two arguments', E_USER_ERROR);
}
//getting two arguments
$args = func_get_args();
$arg1 = $args[0];
$arg2 = $args[1];
//check whether they are integers
if (is_int($arg1) && is_int($arg2)) {
//return sum of two numbers
return $arg1 + $arg2;
}
//check whether they are strings
if (is_string($arg1) && is_string($arg2)) {
//return concatenated string
return $arg1 . ' ' . $arg2;
}
trigger_error('Incorrect parameters passed', E_USER_ERROR);
}
echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World
Phương pháp tiếp cận hướng đối tượng bao gồm quá tải phương thức:
Quá tải trong PHP cung cấp phương tiện để tự động "tạo" các thuộc tính và phương thức. Những thực thể động này được xử lý thông qua các phương thức ma thuật mà người ta có thể thiết lập trong một lớp cho các loại hành động khác nhau.
Tham chiếu: http://php.net/manual/en/lingu.oop5.overloading.php
Trong PHP, quá tải phương tiện bạn có thể thêm các thành viên đối tượng ở thời gian chạy, bằng cách thực hiện một số phương pháp kỳ diệu như __set
, __get
, __call
, vv
class Foo {
public function __call($method, $args) {
if ($method === 'findSum') {
echo 'Sum is calculated to ' . $this->_getSum($args);
} else {
echo "Called method $method";
}
}
private function _getSum($args) {
$sum = 0;
foreach ($args as $arg) {
$sum += $arg;
}
return $sum;
}
}
$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75