Hướng dẫn hàm ẩn danh php

Các hàm ẩn danh (anonymous function) là các hàm chỉ sử dụng duy nhất một lần. Nó có thể được định nghĩa vào bất cứ lúc nào, và thường gắn với một biến hoặc gán vào một hàm khác như một tham số . Các hàm này chỉ tồn tại trong phạm vi của biến mà nó được định nghĩa, vì vậy khi biến đó vượt ra ngoài phạm vi, thì hàm này cũng không còn nữa.

Cú pháp:

function (){
  // Chú ý không có tên hàm
}

Cách sử dụng hàm ẩn danh.

Bởi vì các hàm này không có tên, nên chúng ta không thể gọi nó như một chức năng thường xuyên. Thay vào đó ta phải gán nó vào một biến hoặc cho vào 1 hàm khác khác như là một tham số.

Ví dụ:

	

Xem ví dụ

Truyền tham số.

Xem ví dụ

Để sử dụng các hàm ẩn danh, chúng ta gán nó vào một biến và sau đó gọi là biến như là một function như trên. Hoặc sử dụng hàm ẩn danh như thế này.

Ví dụ:

Xem ví dụ
 

Hàm ẩn danh rất hữu dụng trong một số trường hợp, Đôi khi chúng ta không cần phải tạo hẳn một hàm cho ,một lần sử dụng duy nhất.

Thông thường, chúng ta sẽ cần một hàm để 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 đó bỏ đi để nó ở đó, chúng ta có thể sử dụng một hàm ẩn danh để thay thế.

Nếu như các bạn đã từng làm việc với Laravel thì chắc khái niệm này đã không còn là quá xa lạ, khái niệm này trong jquery cũng dùng rất nhiều. khái niệm mình đang nói đến chính là closure, lambda và bài này mình sẽ giới thiệu đến mọi người về nó trong PHP.

Chú ý: Bài này không nằm trong series hướng đối tượng, nhưng nó là phần nâng cao nên mình cho vào danh mục này.

Lambda là gì?

- 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 của biến mà nó được định nghĩa, vì vậy nếu như biến đó vượt ra ngoài phạm vi thì hàm này cũng không còn tác dụng nữa.

Lambda thường được dùng để gán vào biến, hay được gán vào hàm,class như một tham số.

Khai báo lambda

-Để khai báo lambda trong PHP chúng ta sử dụng cú pháp:

function (argument)
{
    //code
}

Hoặc có thể sử dụng hàm create_function() trong PHP.

create_function('', argument);

Trong đó: Trong đó argument là các tham số bạn muốn truyền vào tham số ẩn danh.

VD1: Khai báo hàm ẩn có tác dụng in ra chuỗi 'Học lập trình online toidicode.com'.

function ()
{
    return 'Học lập trình online toidicode.com';
}

Sử dụng lambda

-Như ở trên mình có nói là lambda thường được gán vào biến, hoặc gán vào hàm, class như một tham số. Giờ mình sẽ làm các ví dụ chứng minh cho điều đó.

VD2: Sử dụng hàm ẩn danh vào biến.

Chú ý: Nếu gán hàm ẩn danh bạn phải chú ý dấu ; phía sau định nghĩa hàm ẩn danh.

VD3: Sử dụng hàm ẩn danh như một tham số trong hàm.

VD4: Sử dụng hàm ẩn danh như một tham số trong class, phương thức.

role = $role;
    }

    function getRole($role)
    {
        return $role();
    }
}

//khởi tạo class Role
$role = new Role(function () {
    return 'Học lập trình PHP Toidicode.com';
});
//gán data bằng thuộc tính role
$data = $role->role;
//hiển thị role
echo $data();
//Kết quả: Học lập trình PHP Toidicode.com
//gọi getRole
echo $role->getRole(function () {
    return 'Học lập trình Nodejs Toidicode.com';
});
//Kêt quả: Học lập trình Nodejs Toidicode.com

Truyền tham số trong lambda

-Đương nhiên, vì lambda cũng là hàm nên phải cho truyền tham số vô rồi.

VD5: Truyền tham số vào hàm ẩn danh.

2, Closure.

Closure là gì?

-Thực ra thì một closure cũng là 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.

Khai báo closure

-Để khai báo closure trong PHP chúng ta sẽ sự dụng cú pháp:

function (argument) use (scope) {
    //code
}

Trong đó:

  • argument là các tham số các bạn muốn truyền vào trong closure.
  • scope là danh sách các biến phía ngoài closure mà các bạn muốn sử dụng trong closure.

VD6:

Sử dụng closure

- Vì closure khá giống với lambda nên mình sẽ không ví dụ các phần giống, mà sẽ chỉ trình bày các VD khác liên quan.

VD7: Tham chiếu trong Closure.

VD8: Closure trong Class.

products[$product] = $quantity;
    }

    public function getQuantity($product)
    {
        return isset($this->products[$product]) ? $this->products[$product] :
            FALSE;
    }

    public function getTotal($tax)
    {
        $total = 0.00;

        $callback =
            function ($quantity, $product) use ($tax, &$total) {
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };

        array_walk($this->products, $callback);
        return round($total, 2);
    }
}

$my_cart = new Cart;

// Thêm sản phẩm
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);

// In ra tổng số tiền khi đã sale 5%.
print $my_cart->getTotal(0.05) . "\n";
// Kết Quả: 54.29

3, Lời kết.

-Như vậy mình đã trình bày xong đến mọi người về hàm ẩn danh lambda và closure trong PHP rồi, bạn nào muốn tìm hiểu chi tiết hơn thì có thể tham khảo link.

Chúc các bạn học tốt!