Trong các ngôn ngữ lập trình thông dụng, chúng ta thường gặp khái niệm về hàm ẩn danh (Anonymous Function), hay còn được gọi là lambda function hoặc closure. Hàm ẩn danh trong PHP cũng là khái niệm không thể thiếu, và cũng cần nắm rõ để có thể xử lý các tác vụ phức tạp một cách dễ dàng và hiệu quả hơn. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về hàm ẩn danh trong PHP, về cách sử dụng cũng như lợi ích mà chúng mang lại.

Bạn muốn trở thành một nhà lập trình PHP chuyên nghiệp? Hãy bắt đầu với cuốn Ebook hữu ích từ Stringee! 

>>> ĐĂNG KÝ NHẬN EBOOK PHP MIỄN PHÍ TẠI ĐÂY:  

1. Hàm ẩn danh là gì?

Hàm ẩn danh là các hàm không tên, nó cho phép chúng ta khai báo các hàm bằng cách gán chúng vào một biến hoặc cũng có thể truyền nó vào các hàm khác như một tham số mà không cần đặt tên cho nó. Điều này mang lại khả năng tạo và sử dụng hàm linh hoạt khi mà chúng ta không cần phải khai báo chúng bên ngoài ngữ cảnh.

Ví dụ:

// Khai báo hàm ẩn danh
$anonymousFunction = function($param, ...) {
    // Code block
};

// Gọi hàm ẩn danh
$anonymousFunction($param1, $param2, ...);

// Gán hàm ẩn danh
// Khi ta gán hàm ẩn danh thì việc chúng ta dùng hàm
// $anonymousFunctionCopy hay $anonymousFunction đều cho ta kết quả như nhau
$anonymousFunctionCopy = $anonymousFunction;

2. Sử dụng hàm ẩn danh

  • Gán hàm ẩn danh vào biến

Với hàm ẩn danh ta có thể gán nó vào một biến, khi sử dụng thì chúng ta sẽ gọi các biến này như cách chúng ta gọi một hàm thông thường. Điều này thường được sử dụng để tạo các hàm callback cho các hàm khác.

$diff = function($a, $b) {
    return $a - $b;
}

$result = $diff(10, 5); // Kết quả: 5
  • Sử dụng hàm như tham số.

Các hàm ẩn danh thường được sử dụng để truyền như các tham số cho các hàm khác. Một số ví dụ như khi sử dụng các hàm array_map hoặc usort:

$arrNum= [3, 1, 4, 1, 5, 9, 2, 6, 5];
usort($numbers, function($a, $b) {
    return $a - $b;
});

/**
 * Kết quả: Array
 * Array
 * (
 *     [0] => 1
 *     [1] => 1
 *     [2] => 2
 *     [3] => 3
 *     [4] => 4
 *     [5] => 5
 *     [6] => 5
 *     [7] => 6
 *     [8] => 9
 * )
 */
  • Sử dụng các biến từ phạm vi bên ngoài

Các hàm ẩn danh không thể truy cập trực tiếp với các biến ở phạm vi cha.

Ví dụ sau là một ví dụ truy cập bị lỗi:

$str = 'Stringee';

$echoText = function() {
    echo $str;
}

$echoText();

Giải thích: Trong hàm trên chúng ta có thể thấy rằng không có biến $str cục bộ nào, và vì hàm ẩn danh không thể lấy trực tiếp biến từ hàm cho nên đoạn mã trên sẽ bị lỗi.

Để có thể sử dụng các biến từ phạm vi bên ngoài chúng ta thực hiện như sau . Điều này có tác dụng khi ta cần xử lý các biến trong một số trường hợp đặc biệt.

$multiplier = 2;
$timesTwo = function($number) use ($multiplier) {
    return $number * $multiplier;
};

$result = $timesTwo(5); // Kết quả: 10

Xem thêm bài viết về chủ đề ngôn ngữ lập trình:

- Hàm trong JavaScript và cách xây dựng 
- Những điều cần biết về Arguments Object trong JavaScript 
- Prototype trong javascript hoạt động như thế nào?

3. Lợi ích của hàm ẩn danh

  • Linh hoạt và ngắn gọn: Nhờ việc không phải đặt tên cho các hàm việc này làm ngắn gọn hơn việc viết mã. Điều này góp phần giúp mã dễ đọc cũng như tiết kiệm được nhiều dòng mã cũng như công sức viết mã hơn.
  • Xử lý ngữ cảnh động: Với việc có thể sử dụng các biến từ phạm vi bên ngoài, nó giúp chúng ta xử lý các ngữ cảnh động một cách hiệu quả hơn. Điều này cũng giảm tải việc truyền quá nhiều tham số với các tác vụ phức tạp.
  • Callbacks linh hoạt: Với việc sử dụng để làm callbacks cho các hàm xử lý khác. Điều này giúp tăng tính linh hoạt và tái sử dụng mã một cách hiệu quả hơn.

4. Hạn chế khi sử dụng hàm ẩn danh

  • Khó đọc và hiểu: Khi chúng ta sử dụng quá nhiều hàm ẩn danh cùng lúc trong một tác vụ, nó có thể khiển cho các đoạn mã trở nên khó đọc, khó hiểu. Gây trở ngại cho việc nâng cấp cũng như bảo trì mã về sau này.
  • Gây nhầm lẫn: Việc sử dụng các hàm ẩn danh có thể gây ra các nhầm lẫn, đồng thời hàm ẩn danh gây khó khăn hơn trong việc xác định nguyên nhân khi có lỗi xảy ra. Thường lỗi này dễ gặp hơn khi chúng ta sử dụng hàm ẩn danh như các callbacks function.
  • Khó theo dõi ngữ cảnh: Trong khi sử dụng hàm ẩn danh, việc theo dõi và hiểu chính xác ngữ cảnh cũng như giá trị của các biến trở nên khó khăn hơn. Việc này thường sẽ gặp phải khi chúng ta sử dụng thêm các biến được truyền từ phạm vị bên ngoài vào hàm ẩn danh.

5. Tổng kết

Với những gì đã nó ở trên, chúng ta có thể thấy rằng hàm ẩn danh trong PHP là một công cụ rất mạnh mẽ có thể giúp chúng ta viết mã một cách linh hoạt và hiệu quả hơn. Tuy nhiên, đi kèm những lợi ích cũng là các hạn chế của hàm ẩn danh. Cho nên, khi sử dụng chúng ta luôn phải cân nhắc một cách thật kỹ lưỡng để đảm bảo mã dễ đọc, dễ bảo trì cũng như tránh các vấn đề gây nhầm lẫn. Sử dụng hàm ẩn danh một cách thông minh, có sự cân nhắc và có kế hoạch sẽ mang lại nhiều lợi ích cũng nhiều nhiều đặc sắc trong việc xử lý mã.

Stringee Communication APIs là giải pháp cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng có thể tích hợp trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Bộ giải pháp này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Mời quý bạn đọc đăng ký dùng thử và nhận tư vấn tại đây: