Hàm ẩn danh Anonymous function trong PHP

Hàm ẩn danh (Anonymous function, còn gọi là hàm không tên, hay closure), nó cho phép tạo ra các hàm mà hàm đó không có tên. Nó hữu ích khi được dùng làm tham số cho một hàm khác, hay lưu vào một biến mà thông qua biến thi hành được code viết trong hàm không tên. Các hàm không tên, thực tế là triển khai của lớp Closure trong PHP

Cú pháp tạo hàm ẩn danh

function(các_tham_số_hàm_ẩn_danh) {
    // code trong thân hàm ẩn dah
};

Vấn đề là hàm ẩn danh là không có tên, do vậy nó cần gán vào một biến nào đó để sử dụng lại, hoặc phải viết trực tiếp trong tham số của hàm để nó gán vào tham số hàm.

Ví dụ 1: Tạo vào sử dụng hàm ẩn danh - anonymous function với PHP

// Tạo ra một hàm ẩn danh lưu vào biến $tong, có chức năng tính tổng
$tong = function ($a, $b)
{
    return $a + $b;
};

// Gọi hàm ẩn danh lưu trong biến tổng, gọi tương tự gọi hàm
$kq = $tong(5, 10);
echo '<br>Kết quả = ' . $kq;

// Gán hàm ẩn danh
$sum_function = $tong;
echo '<br>Kết quả = ' . $sum_function(5,5);

// KẾT QUẢ:
// Kết quả =  15
// Kết quả =  10

Ví dụ 2: Khai báo hàm ẩn danh trực tiếp trong tham số callback của hàm

Giá sử có hàm sau, hàm nhận tham số là một hàm callback

// Hàm tính toán, gọi hàm callback trong $callback để tính toán
// dựa trên hai tham số $a, $b
function tinhtoan(callable $callback, $a, $b)
{
    $kq = $callback($a, $b);
    echo '<
>Kết quả tính toán là:' . $kq; }

Nếu vậy bạn có thể sử dụng hàm ẩn danh lưu trong $tong ở trên làm tham số:

tinhtoan($tong, 5, 10);
// Kết quả tính toán là: 15;

Hoặc bạn có thể khai báo trực tiếp một hàm ẩn danh tại tham số $callback của hàm tinhtoan:

tinhtoan(function ($a, $b) {
            return $a + $b ;
            },
    5, 10);
// Kết quả tính toán là: 15;

Ví dụ, in ra kết quả tính toán của phép nhân

tinhtoan(function ($a, $b) {
            return $a * $b ;
            },
    5, 10);
// Kết quả tính toán là: 50;

Bạn có thể kiểm tra, hàm ẩn danh là một đối tượng thuộc lớp Closure

var_dump($tong);

Hàm ẩn danh - truy cập biến ở phạm vi cha

Các hàm ẩn danh (closure) đóng gói phạm vi truy cập của nó, có nghĩa bên trong thân hàm ẩn danh chỉ có thể sử dụng các biến được khai báo, định nghĩa trong thân hàm ẩn danh. Ví dụ sau là lỗi:

// biến ở phạm vi cha
$thongbao = 'Kết quả căn bậc 2 là: ';

// Hàm vô danh cố gắng truy cập đến biến $thongbao
$can_bac_hai = function ($a) {
    // LỖI
    // Không thể truy cập biến $thongbao
    // hoặc không có biến $thongbao cục bộ nào
    return $thongbao . sqrt($a);
};
echo $can_bac_hai(9);

Nếu muốn truy cập các biến ở phạm vị cha, sau phần tham số cho thêm use(các_biến_ở_phạm_vi_cha)

// biến ở phạm vi cha
$thongbao = 'Kết quả căn bậc 2 là: ';

// Hàm ẩn danh có thể truy cập đến $thongbao
$can_bac_hai = function ($a) use ($thongbao) {
    return $thongbao . sqrt($a);
};
echo $can_bac_hai(9);
// Kết quả căn bậc 2 là: 3
A closure encapsulates its scope, meaning that it has no access to the scope in which it is defined or executed. It is, however, possible to inherit variables from the parent scope (where the closure is defined) into the closure with the use keyword:

Arrow function (hàm mũi tên) trong PHP

Hàm mũi tên Arrow function chính là hàm ẩn danh Anonymous function, được giới thiệu từ PHP7.4, hàm Arrow cho phép tạo ra hàm ẩn danh với cú pháp ngắn hơn bằng cách sử dụng ký hiệu mũi tên =>, cú pháp khai báo

fn(tham_số_hàm_ẩn_danh) => một_biểu_thức_giá_trị;

Có nghĩa nó tương đương với, cách tạo ra hàm ẩn danh thông thường:

function(tham_số_hàm_ẩn_danh) {
    return một_biểu_thức_giá_trị;
};

Các ví dụ trên có sử dụng hàm mũi tên:

// Khai báo hàm mũi tên, chính là hàm ẩn danh
$tong = fn($a, $b) => $a + $b;

// Gọi hàm ẩn danh lưu trong biến tổng
$kq = $tong(5, 10);
echo '<br>Kết quả = ' . $kq;

// Tạo hàm mũi tên, ngay trong tham số callback của một hàm
tinhtoan(fn($a, $b) => $a + $b, 5, 10);

Chú ý: hàm mũi tên, có thể sử dụng biến ở phạm vi cha một cách tự động, không cần dùng từ khóa use

// biến ở phạm vi cha
$thongbao = 'Kết quả căn bậc 2 là: ';
// hàm mũi tên, truy cập được biến $thongbao trong phạm vi cha
$can_bac_hai = fn($a) =>  $thongbao . sqrt($a);
echo $can_bac_hai(9);

Đăng ký nhận bài viết mới