New features Closure in php 7.1

Nhắc đến closure chắc hẳn ko ai còn lạ gì nữa. Bắt đầu từ phiên bản php 5.3, PHP ra mắt closure với anonymous function (Hay được sử dụng trong nhiều javascript). Điều này khá tuyệt với với những ai muốn callback hoặc tái sử dụng các đoạn code đã viết trong abstract.

Introducing Closure::fromCallable()

Bắt đầu từ PHP 7.1 trở đi. Closure có thêm 1 method static mới đó là fromCallable().

Nó là cái gì và dùng như thế nào.

Closure đã awesome rồi thì ngày nay có thêm fromCallable nó lại càng mạnh mẽ hơn bao giờ hết.

Bình thường nếu dùng closure các bạn sẽ hay dùng.

$this->callback(function ($number) {
     return $item * 2;
});

và bây giờ với fromCallable() chúng ta có thể dùng

// My function that i want callback
function my_function($item) {
    return $item * 2
}
$callback = Closure::fromCallable('my_function');
$callback();

xem nào tại sao tính năng mới thế này mà lại rắc rối vậy nhỉ. Có lẽ rằng nó dùng để giải quyết nguyên lý DRY tận dụng tối đa cho những method đã có sẵn.

Một vài tình huống hay dùng

Hay gặp nhất có lẽ là trong collection của laravel

$collect = collect([1, 1.5, 2, 2.5, 3]);

$integer = $collect->reject(function ($number) {
    return is_float($number)
});

Thật tồi tệ đôi khi mình chỉ muốn viết cho gọn

$integer = $collect->reject('is_float');

Nhưng nó ko hoạt động mới cay.

với fromCallable() Tình hình có vẻ ổn hơn

$integer = $collect->reject(Closure::fromCallable('is_float'));

Xây dựng một closure được bao bọc trong private method

Bạn cũng có thể dùng trong nhiều trường hợp khác như khai báo trong validator

	
class Validator {
 
  public function getValidatorCallback($validationType) {
 
    if ($validationType == 'email') {
      return Closure::fromCallable([$this, 'emailValidation']);
    }
 
    return Closure::fromCallable([$this, 'genericValidation']);
  }
 
  private function emailValidation($userData) {...}
 
  private function genericValidation($userData) {...}
}

// Use
$validator = new Validator();
 
$callback =
 $validator->getValidatorCallback('email');
 
$callback($userData);

Tuy nhiên sức mạnh của fromCallable() Không chỉ có vậy. Hãy nhìn ở ví dụ trên xem nó có thể call được những method private hoặc protected và nó còn có thể call được method từ 1 class khác với cấu trúc [$object, 'method'].

Kết luận

Đây chỉ là 1 cải tiến nhỏ trong php 7.1 tuy nhiên nó cũng có vẻ rất hữu dụng. Hi vọng các bạn có thể tận dụng nó vào 1 số tình huống hữu ích.

Resource

http://php.net/manual/ro/closure.fromcallable.php