Callback trong PHP là gì?

Callback là gì?

Callback là khái niệm một hàm được truyền vào một hàm khác như một tham số để nó có thể được thực hiện trước hoặc sau một sự kiện hoặc một thay đổi trạng thái.

Trong thực tế, callback nghĩa là gọi lại, xem xét một ví dụ sau, một người hỗ trợ sẽ thực hiện lấy các thông tin về lỗi của người dùng sau đó mới gọi lại (callback) cho khách hàng. Trong PHP, thực hiện callback là rất đơn giản. Chúng ta xem một ví dụ sau:

<?php
function sayHello($callback) {
    echo "Xin chào!</br>";
    // Các câu chuyện khác ở giữa xin chào và tạm biệt
    // ...
    $callback();
}
function sayGoodbye() {
    echo "Tạm biệt!";
}

sayHello('sayGoodbye');
// Kết quả
// Xin chào!
// ...
// Tạm biệt

Trên đây là một ví dụ rất đơn giản về callback trong PHP, hàm sayGoodbye được truyền vào hàm sayHello như một tham số. Cách thực hiện này rất hữu ích khi chúng ta muốn định nghĩa một hàm (sayGoodbye) được thực hiện khi một sự kiện xảy ra (sau các câu chuyện khác). Ví dụ trên đây khá dễ hiểu nhưng có một khía cạnh chưa được bàn đến là việc sử dụng kết quả của hàm gọi trong hàm được gọi. Ví dụ tiếp theo cho thấy hỗ trợ viên sau khi lấy thông tin về lỗi người dùng và sử dụng thông tin này để gọi lại cho khách hàng:

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    $callback($full_name);
}
function formatName($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'formatName');

Kết quả như sau:

Ví dụ callback trong PHP

Bản chất của $callback($full_name); là gọi đến một hàm được xây dựng sẵn trong PHP call_user_func, như vậy $callback($full_name); là tương đương với call_user_func($callback, $full_name); Sử dụng callback có thể có lỗi xảy ra nếu chúng ta callback đến một hàm chưa được định nghĩa, vậy chúng ta cần kiểm tra biến được truyền vào có phải là một hàm hay không bằng hàm is_callable():

<?php
function sayHello($first_name, $last_name, $callback) {
    $full_name = $first_name . ' ' . $last_name;
    if (is_callable($callback)) {
        call_user_func($callback, $full_name);
    }
}
function format($full_name) {
    echo '<h2 style="color:red;">Xin chào '. $full_name . '!<h2>';
}

sayHello('Nguyễn Văn', 'A', 'format');

Sử dụng callback ở đâu?

Callback thường được sử dụng trong những tình huống sau:

  • Khi ứng dụng cần thực hiện một hàm khác dựa trên ngữ cảnh hoặc trạng thái, hay nói một cách khác là muốn thực hiện một việc gì đó khi một sự kiện xảy ra.
  • Sử dụng với các hàm nặc danh (anonymous function) hoặc với Closure.
  • Lập trình đa luồng (multiple thread).

Ví dụ về lập xử lý đa luồng, chúng ta cần mở một file và ghi vào file một cái gì đó, vì file này rất lớn nên việc mở file có thể mất một chút thời gian. Nếu như viết theo cách cũ:

fileObject = open(file)
// Cần phải chờ file được mở thì mới ghi vào file được, có thể mất 5 phút chẳng hạn.
fileObject.write("We are writing to the file.")
// Tiếp theo mới làm được những việc khác
doSomething();

Sử dụng callback, chúng ta có thể thực hiện được những việc khác luôn

fileObject = open(file, writeToFile)
// Không cần phải chờ file mở và ghi vào file, chúng ta có thể thực hiện việc khác luôn.
doSomething();

Add Comment