Anonymous Function và vấn đề Callback trong PHP

Tram Ho

Callback()??? Thứ mà các bạn vẫn nghe ra rả (hoặc đọc) trong các tutorial về Javascript thì giờ đây còn xuất hiện trong cả PHP. À thật ra thì nó có từ thời nhà Tống rồi nên nếu ai biết rồi thì gạch đá em nhẹ tay 😄

Với các bạn còn chưa tiếp cận PHP lâu chắc sẽ còn xa lạ với khái niệm này hay thậm chí không tin là nó có tồn tại, cho đến khi bạn làm việc với Laravel một thời gian bạn cũng còn chưa nhận ra là mình đã từng sử dụng nó?! Vậy hãy nhìn vào function sau:

Trông quen không?? Thì cái cục function ($query) ... kia được gọi là một callback function của whereHas()

Để hiểu được rốt cuộc callback() trong PHP có gì hay ho thì hãy bắt đầu tìm hiểu về

Anonymous Function

Như title, đây chính là nguồn gốc của callback hay nói ngắn gọn: một callback function chính là một Anonymouse Function.
Đúng như cái tên, đây là một function vô danh, tức là nó không có tên mà chỉ được định nghĩa là một function và sẽ thực hiện một công việc gì đó.

Đây là một function không vô danh, tức là một function được khai báo bình thường

Và cách sử dụng cũng bình thường luôn 😐

Anonymouse Function về cơ bản cũng là một function bình thường, nó cũng có thể nhận một tham số và trả về một kết quả nào đó, chỉ khác là chúng được định nghĩa mà không có tên, ví dụ:

Tuy nhiên có 2 điểm cần lưu ý, đầu tiên là function này không có tên (rõ ràng 😐), thứ hai là kết thúc của nó luôn là một dấu chấm phẩy phía sau dấu mở ngoặc cuối cùng kia kìa.

Nhưng sử dụng kiểu gì? Vì khi chúng ta muốn sử dụng một function, chúng ta sẽ gọi đến tên của nó, còn function mà không có tên thì gọi vào mắt à???

Gán biến cho Anonymous Function

AF (Anonymous Function) có thể được gán cho một biến bất kỳ, biến này sao đó được gọi ra tương tự một function hay thậm chí có thể được push vào một mảng, và thế là ta có một mảng các function luôn, khá là hữu ích trong nhiều trường hợp mà mình chưa nghĩ ra :3

Hay thậm chí là tạo ra hẳn một mảng các function

Tạo ra một Closure (Thứ mà chúng ta sẽ tìm hiểu trong một bài viết khác)

Cuối cùng thứ quan trọng nhất, làm một callback functioin

Callback Function

Đây gần như là chức năng quan trọng nhất của một AF, cho bạn nào còn chưa biết thế nào là callback thì nó là một function được đưa vào một function khác dưới dạng một tham số và function này có thể sử dụng các local scope trong function mà nó được đưa vào.

Hãy xem qua ví dụ dưới đây:

Trong ví dụ này, tham số thứ 2 đưa vào function showText chính làm một Callback function được viết dưới dạng một Anonymous Function.
Có bạn sẽ thằng mắc rằng trong ví dụ trên, callback đã hoạt động thế nào?

Giải thích:

  • Đầu tiên khi showText được gọi, tham số đầu tiên của nó là 'Tony Stark' được đưa vào dưới biến $string, $string được đưa vào mảng $result để xử lý.
  • Nếu có tham số thứ 2 truyền vào thì if sẽ kiểm tra nó có phải là một function hay không, nếu có thì gọi call_user_func để bind local scope $result thành tham số $name của callback.
  • Lúc nào ta có $name chính là $result và có thể gọi nó ra như bình thường.

Như có thể thấy, một callback trong PHP về cơ bản thì vẫn khá là giống với JS và bạn có hàng tá cách sử dụng với nó (mà bạn vẫn dùng hàng ngày) mà bạn có thể nghĩ ra, hoặc nếu không thì PHP cũng đã defined một lô các function mà có thể bạn không biết :v

array_map()

array_map() chấp nhận tham số truyền vào là một callback function và tham số thứ 2 là một mảng, cho phép callback function mà bạn truyền vào xử lý gì đó với mảng:

array_filter()

Tương tự như trên, function này cũng chấp nhận tham số truyền vào là một mảng và một callback, và bạn có thể lọc mảng theo một điều kiện nào đó mà bạn định nghĩa trong callback, thay vì phải dùng foreachif

Và đương nhiên thứ mà bạn thấy rất nhiều trong Laravel: collect()->map(function() { ... })collect()->filter(function () { ... }) cũng chính là từ 2 function trên mà ra.

Lan man

Có một câu hỏi mà mình đã tự hỏi là, liệu callback trong PHP có thể bị hell như trong JS??

Ý kiến cá nhân của mình thì là không, vì callback trong JS được sử dụng rất nhiều, nhất là khi code được xử lý bất đồng bộ kém. Còn với PHP, một ngôn ngữ có sự đồng bộ từ trên xuống dưới nên điều này sẽ khó có thể xảy ra nếu không muốn nói là không thể.

Còn ý kiến của các bạn thì sao? Hãy cho mình biết dưới phần comment, xin cám ơn đã theo dõi bài viết!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo