3 dấu chấm nhưng ít khi được quan tâm trong PHP
splat operator
1
PHP
74
TIL
496
White

Nguyễn Thế Huy viết ngày 05/02/2018

TIL

Hôm nay mình làm việc với Laravel, có một cái logic cần group lại nhiều cột với nhau. Chả hiểu thế nào lại bấm vào đọc cái hàm groupBy của Eloquent:

public function groupBy(...$groups)
 {
        foreach ($groups as $group) {
            $this->groups = array_merge(
                (array) $this->groups,
                array_wrap($group)
            );
        }

        return $this;
}

Thấy cái dấu ... nó lạ quá, nên mới tìm hiểu thử. Hóa ra cái operator này còn được gọi là Splat Operator. Theo đó, nó đại diện cho các parameter mà ta truyền vào hàm, và đưa nó thành một cái mảng. Ví dụ đối với code trên, khi gọi

groupBy('col1', 'col2')

thì cái biến$groups đó nó sẽ là một cái mảng ['col1', 'col2']

Đến đây thì nó rõ ràng là khá hữu dụng, vì giải quyết được mấy vấn đề:

  • Dynamic parameters: Bạn có thể thoải mái về số params truyền vào, ngay ví dụ trên nó đã chứng minh điều đó
  • Với công cụ này, bạn hoàn toàn kết hợp được giữa việc truyền tham số thông thường và truyền tham số với splat operation. Ta có thể truyền tham số là một hàm, cùng với các tham số còn lại là biến. Kiểu:
 function concatenate($transform, ...$strings) {
        $string = '';
        foreach($strings as $piece) {
            $string .= $piece;
        }
        return($transform($string));
    }

    echo concatenate("strtoupper", "I'd ", "like ",
        4 + 2, " apples");

Với ví dụ này ta nhận ra thêm một chú ý là chỉ có tham số cuối cùng là áp dụng Splat Operator được. Điều đó có nghĩa là

function(...$b, ...$c)

là không hợp lệ.

Ví dụ này mình lấy tại trang này

  • Truyền tham số đơn giản và nhẹ nhàng hơn

Với splat operator như thế này, sẽ làm cho code của chúng ta sexy hơn. Ví dụ với hàm mail:

mail ( string $to , string $subject , string $message)

Có thể viết lại thành:

 $email[] = "Hi there";
 $email[] = "Thanks for registering, hope you like it";
 mail("someone@example.com", ...$email);

PHP sẽ tự động trích xuất các phần tử trong mảng và truyền nó theo đúng thứ tự đó vào trong hàm. Trông code ngắn gọn đẹp đẽ hơn hẳn đúng không :D

Chỉ là một operator nhỏ nhưng mình nghĩ là rất có ích và chúng ta có thể áp dụng vào code PHP ngay bây giờ (Splat operator được hỗ trợ từ PHP 5.6 thì phải). Cám ơn các bạn đã đọc bài viết.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Thế Huy

2 bài viết.
17 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
24 8
Hi cả nhà, đây là bài viết đầu tiên của mình trên Kipalog nên có gì không hay mong các bạn thông cảm :D Realtime là gì ? Như chúng ta đều đã biế...
Nguyễn Thế Huy viết 4 tháng trước
24 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
17 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!