Khái niệm về hàm callback trong lập trình
Hàm callback là tham chiếu đến khối code có thể thi hành mà khối code đó (hàm đó) được dùng như một tham số của một hàm khác, tham số này được thực thi như là một trong những nhiệm vụ của hàm. Tùy thuộc ngôn ngữ lập trình, sự hỗ trợ sử dụng hàm callback là khác nhau: như con trỏ đến hàm (trong C++), biểu thức lambda (trong C#, Java, Js) ...
Tóm lại: Hàm callback là hàm được sử dụng như một tham số cho hàm khác. Hàm khác gọi hàm callback trong thân của nó để giải quyết nhiệm vụ của nó.
Hàm Callback / Callable trong PHP
Trong lập trình PHP, hàm callback (còn gọi là callable) có thể là một hàm toàn cục độc lập, một phương thức
trong lớp (kể cả phương thức tĩnh cũng có thể là callback),
hàm ẩn danh (Anonymous function), Arrow function,
kể cả mội lớp có thể chạy (có khai báo phương thức __invoke
- xem thêm hàm __invoke)
1) Hàm callback là một hàm global
Trong tham số bạn chỉ cần truyền một chuỗi là tên của hàm, ví dụ:
function phepcong($a, $b) { echo 'Tổng là', ($a+$b), PHP_EOL; } function phepnhan($a, $b) { echo 'Tích là', ($a * $b), PHP_EOL; } // Khai báo hàm tính toán theo hai tham số $a, $b // $pheptinh là tham số lưu trữ một hàm (do vậy gọi là callback) function tinhtoan($pheptinh, $a, $b) { // Gọi hàm lưu trong $pheptinh $pheptinh($a, $b); } tinhtoan('phepcong', 5,5); // in ra 10 tinhtoan('phepnhan', 5,5); // in ra 25
phepcong, phepnhan được sử dụng như callback, là tham số cho hàm tinhtoan.
2) Nếu hàm callback là một phương thức (hàm) của đối tượng lớp (trong class)
Bạn cần biết là, một đối tượng lớp $obj
, giá sử có phương thức xyz($a, $b)
, thì để gọi
phương thực này bạn gọi nó như đã biết là:
$obj->xyz(3,4);
Ngoài ra trong PHP, bạn còn có thể sử dụng mảng hai phân tử để cho biết tham chiếu đến $obj
rồi đến $xyz
,
mảng đó có thể gọi như hàm. Cú pháp là
[$obj,'xyz'](3,4); // tương đương $obj->xyz(3,4); // hoặc $xyz = [$obj,'xyz']; $xyz(3,4); // tương đương $obj->xyz(3,4);
Như vậy, để truyền một phương thức của đối tượng lớp bạn chỉ cần truyền mảng hai phần tử [đối-tượng, 'tên-phương-thức']
class Pheptinh { public function Cong($a, $b) { echo 'Tổng là', ($a+$b), PHP_EOL; } public function Nhan($a, $b) { echo 'Tích là', ($a * $b), PHP_EOL; } public static function Chia($a,$b) { echo 'Thương là', ($a / $b), PHP_EOL; } } $obj = new Pheptinh(); // Phương thức Cong trong $obj là callback tinhtoan([$obj, 'Cong'], 5,5); // Phương thức Nhan trong $obj là callback tinhtoan(array($obj, 'Nhan'), 5,5);
3) Nếu hàm callback là một hàm tĩnh trong class (static method)
Bạn truyền bằng cách tạo ra mảng hai phần tử ['TÊN-LỚP', 'TÊN-HÀM'], ví dụ:
tinhtoan(['Pheptinh', 'Chia'], 5,5);
4) Hàm callback như là một anonymous - hàm ẩn danh hoặc arrow function
Bạn chỉ việc khai báo trực tiếp tại tham số callback, hoặc truyền qua một biến
tinhtoan(function ($a, $b) { echo 'Tổng là', ($a+$b), PHP_EOL; }, 5, 5); // Khai báo hàm ẩn danh, lưu vào $hieu, rồi truyền cho hàm $hieu = function ($a, $b) { echo 'Hiệu là', ($a - $b), PHP_EOL; }; tinhtoan($hieu, 5, 5);
Xem thêm: Hàm ẩn danh - php
5) Hàm callback là đối tượng lớp thi hành được
Trường hợp này chỉ việc truyền đối tượng lớp, ví dụ:
class MyClass { public function __invoke($a, $b){ echo 'Hiệu là', ($a - $b), PHP_EOL; } } $obj = new MyClass; tinhtoan($obj, 5, 5);
Xem thêm: Phương thức magic __invoke