Đối với một hàm trong PHP, ngoài các kiểu dữ liệu nguyên thủy, mảng và đối tượng, bạn cũng có thể truyền một hàm như một trong các tham số của nó. Nếu một hàm được định nghĩa để chấp nhận một hàm khác làm tham số, hàm được truyền vào sẽ được gọi bên trong nó. Thư viện chuẩn của PHP có một số hàm tích hợp sẵn kiểu này, trong đó một trong các tham số được truyền vào là một hàm, có thể là một hàm tích hợp sẵn khác hoặc thậm chí là một hàm do người dùng định nghĩa.
Hàm array_map() là một trong những hàm tích hợp sẵn. Tham số đầu tiên của hàm này là một hàm gọi lại (callback function). Có thể có một hoặc nhiều mảng làm các tham số khác. Hàm gọi lại được áp dụng cho tất cả các phần tử của các mảng.
array_map(?callable $callback, array $array, array ...$arrays): array
Hàm array_map() trả về một mảng. Nó chứa kết quả của việc áp dụng hàm callback cho các phần tử tương ứng của các mảng được truyền dưới dạng các đối số khác.
Trong ví dụ sau, chúng ta có một hàm square() tính bình phương của một số được truyền vào. Hàm này được sử dụng như một đối số cho hàm array_map(), cùng với một mảng số khác. Mỗi số sẽ lần lượt được truyền vào hàm square(). Mảng kết quả là một danh sách các bình phương.
<?php function square($number) { return $number * $number; } $arr = [1, 2, 3, 4, 5]; $squares = array_map('square', $arr); var_dump($squares); ?>
Nó sẽ tạo ra output −
array(5) { [0]=> int(1) [1]=> int(4) [2]=> int(9) [3]=> int(16) [4]=> int(25) }
Một ví dụ khác về việc truyền một hàm cho một hàm khác là call_user_func(). Như tên gọi gợi ý, nó gọi một hàm callback do người dùng định nghĩa khác, và các đối số khác được truyền vào hàm callback.
call_user_func(callable $callback, mixed ...$args): mixed
Trong ví dụ dưới đây, hàm square() được gọi nhiều lần, truyền từng số trong một mảng.
<?php function square($number) { return $number * $number; } $arr = [1, 2, 3, 4, 5]; foreach($arr as $a) { echo "square of $a:" . call_user_func("square", $a). PHP_EOL; } ?>
Nó sẽ tạo ra output −
square of 1:1 square of 2:4 square of 3:9 square of 4:16 square of 5:25
Như một ví dụ khác về việc truyền hàm, chúng ta sẽ xem xét hàm usort().
usort(array &$array, callable $callback): true
Tham số đầu tiên là một mảng. Mảng được sắp xếp theo hàm callback, đó là tham số thứ hai.
Tham số callback là một hàm so sánh phải trả về một số nguyên nhỏ hơn, bằng hoặc lớn hơn không nếu đối số đầu tiên được coi là nhỏ hơn, bằng hoặc lớn hơn đối số thứ hai tương ứng.
Dưới đây là một ví dụ. Đầu tiên, chúng ta có một hàm mysort() . Nó so sánh hai số và trả về "-1", "0" hoặc "1" nếu số đầu tiên nhỏ hơn, bằng hoặc lớn hơn số thứ hai.
Đối số đầu tiên của usort() là hàm mysort(), và đối số thứ hai là một mảng. Để bắt đầu, hai số đầu tiên được truyền vào mysort(). Nếu nó trả về 1, chúng sẽ được hoán đổi. Tiếp theo, số thứ hai và thứ ba được truyền vào và sẽ được hoán đổi nếu phép so sánh trả về 1. Quá trình tương tự lặp lại để các phần tử của mảng được sắp xếp theo thứ tự tăng dần.
<?php function mysort($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "mysort"); foreach ($a as $key => $value) { echo "$key: $value\n"; } ?>
Nó sẽ tạo ra output −
0: 1 1: 2 2: 3 3: 5 4: 6
Ngoài các hàm tích hợp sẵn ở trên, bạn có thể định nghĩa hàm của riêng mình mà chấp nhận một trong các đối số là một hàm khác.
Trong ví dụ dưới đây, chúng ta có hai hàm, square() và cube() , trả về bình phương và lập phương của một số cho trước.
Tiếp theo, có myfunction() , trong đó tham số đầu tiên được sử dụng như một hàm biến và tham số thứ hai của myfunction() được truyền cho nó.
Vì vậy, myfunction() sẽ gọi nội bộ square() hoặc cube() để trả về bình phương hoặc lập phương của một số đã cho.
<?php function myfunction($function, $number) { $result = $function($number); return $result; } function cube($number) { return $number ** 2; } function square($number) { return $number ** 3; } $x = 5; $cube = myfunction('cube', $x); $square = myfunction('square', $x); echo "Square of $x = $square" . PHP_EOL; echo "Cube of $x = $cube" . PHP_EOL; ?>
Nó sẽ tạo ra output −
Square of 5 = 125 Cube of 5 = 25