Method, Function, Hàm, Callback, Lambda, Closure.... rất nhiều cách gọi tên hàm trong lập trình, khi đọc tài liệu về một framework hay ngôn ngữ ta sẽ nhầm lẫn và không hiểu được. Vậy chúng ta cùng tìm hiểu nhé.
- Function
- Method
- Lambda
- Closure
- Callback
Bản chất của 5 từ ngữ trên chính là function (hàm) vậy nên bạn gọi Callback là một hàm cũng đúng, Lambda là một hàm cũng không sai.
Mỗi danh từ trên chỉ bổ sung ý nghĩa và định nghĩa riêng cho từng loại thôi.
Ở đây chúng ta chỉ nói đến sự khác nhau về định nghĩa, ý nghĩa nhé, chứ sẽ không bao gồm chi tiết và cú pháp, cách thức thực thi của các danh từ trên nhé.
Function
Function (hàm) là một khối mã được viết để thực hiện một số nhiệm vụ cụ thể và trả về kết quả. Chúng ta có thể xác định một Function bằng cách sử dụng từ khóa function, theo sau là tên Function và các tham số tùy chọn. Thân hàm được bọc trong cặp dấu ngoặc nhọn.
// PHP
function notify($argument) {
echo 'Hello';
}Method
- Là một function
- Khi được khai báo như là một thuộc tính của class (OOP)
// PHP
class User
{
public function notify($argument)
{
echo 'Hello';
}
}Lambda
- Lambda là một anonymous function (hàm ẩn danh) nó có thể khai báo,định nghĩa ở bất kỳ đâu và không có khả năng tái sử dụng.
- Lambda chỉ tồn tại trong phạm vi mà nó định nghĩa, vì vậy nếu như sử dụng nó ngoài phạm vì thì hàm này sẽ không còn tác dụng nữa
- Lambda có thể gán vào 1 biến để sử dụng
// PHP
=> Function
function notify($argument) {
echo 'Hello';
}
=> Anonymous function
function ($argument) {
echo 'Hello';
};
// Hoặc
fn ($argument) => 'hello';Bonus
fn là một anonymous function nó có nghĩa là function. Và, có một return ngầm với arrow function, thường được sử dụng không cùng dấu đóng mở ngoặc nhọn ({}), thưởng sử dụng với nội dung hàm là đơn giản và có return kết quả.
Cú pháp:
fn () => (dữ liệu trả về)Các hàm thông thường muốn thực hiện được chúng ta cần gọi đến tên của nó, còn lambda thì là hàm nặc danh nên để gọi được thì ta sẽ gán nó với một biến hoặc truyền nó như một tham số
// Gọi bằng biến
$notify = function () {
echo 'Hello';
};
$notify();
// Hoặc
$notify = fn () => 'Hello';
echo $notify();
// Gọi như một tham số truyền vào hàm (Callback)
function notify($message) {
$message('Hello');
}
notify(function ($value) {
echo $value;
});
// Hoặc
function notify($message) {
echo $message('Hello');
}
notify(fn ($value) => $value);Sử dụng hay Lambda là rất hữu ích khi các chức năng chúng ta chỉ cần sử dụng một lần duy nhất. Thông thường, chúng ta sẽ cần một hàm nào đó để làm một công việc, nhưng nó không có nghĩa là chúng ta sẽ dùng nó trong phạm vi global. Thay vì có một hàm sử dụng một lần và sau đó không dùng ở đâu nữa, chúng ta có thể sử dụng một hàm ẩn danh để thay thế.
Closure
- Closure cơ bản cũng giống một lambda, nhưng closure có thêm chức năng là có thể sử dụng các biến bên ngoài phạm vi mà nó được tạo ra thông qua use.
- Một đặc điểm nhận dạng Closure function là nó sẽ có từ khoá use phía sau tên của hàm.
function (argument) use (scope) {
//code
}Một ví dụ:
$name = 'Dau Xanh';
$sayHello = function () use ($name) {
return "Xin chào $name";
};
echo $sayHello();Đối với trường hợp sử dụng fn thì không cần phải sử dụng đến use để truy cập vào các biến ngoài phạm vi nữa
$name = 'Dau Xanh';
$sayHello = fn () => "Xin chào $name";
echo $sayHello();Callback
- 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
- Callback thường được sử dụng 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).
Qua các ví dụ như của lambda thì ta cũng thấy rõ được như nào là callback rồi đúng không ạ ?
function sayHello($callback) {
echo "Xin chào!</br>";
// code
// ...
$callback();
}
function sayGoodbye() {
echo "Tạm biệt!";
}
sayHello('sayGoodbye');Như vậy hàm sayGoodbye được gọi như là một callback.
Tổng kết
Trên đây là các khái niệm mình đã đưa ra về tên định nghĩa và cách gọi của chúng. Hi vọng chúng có thể giúp ích cho bạn
Nguồn: https://viblo.asia/p/lambda-closure-va-callback-trong-php-3Q75wEp3ZWb