Đối với những ai đã từng sử dụng framework laravel, thì sự thuận tiện của collection helper là không thể phủ nhận. Nó giúp chúng ta thao tác với dữ liệu một cách thuận tiện và trôi chảy hơn. Tuy nhiên, không phải lúc nào các dự án của chúng ta đều được phép sử dụng framework. Vì khi sử dụng framework, một khi có lỗi xảy ra thì chúng ta rất khó để control. Trong bài viết này, mình xin chia sẻ cách tạo một collection trong PHP thuần. 1. Khởi tạo collection Đầu tiên, coletion phải có khả năng sử dụng trong vòng lặp giống như một array. Collection phải implements IteratorAggregate interface để tạo một Iterator bên ngoài.
Giải thích: Khi chúng ta sử dụng colection trong một vòng lặp, php sẽ kiểm tra xem tham số được sử dụng để lặp có phải là một đối tượng có thể lặp hay không. Việc implements IteratorAggregate interface giúp chúng ta tạo ra một đối tượng như vậy. Interface này yêu cầu chúng ta khởi tạo phương thức getIterator, giá trị trả về là một thể hiện của ArrayIterator. ArrayIterator cho phép lặp một object trong vòng lặp nhiều lần giống như một arrray. Vì chúng ta đã khởi tạo một thể hiện của ArrayIterator ở constructor, nên trong hàm getIterator chúng ta chỉ cần return $this->items là xong. Tới đây, chúng ta đã có thể sử dụng colection trong vòng lặp. Tuy nhiên, collection vẫn là một object, muốn truy cập vào các thuộc tính của nó như một array, chúng ta phải implements ArrayAccess. interface này yêu cầu các methods offsetGet, offsetSet, offsetUnset, offsetUnset:
Hàm offsetGet được gọi khi chúng ta get một thuộc tính của object(ở đây là class Collection của chúng ta) như một array. VD: $collection['key1'], $collection['key2'] Khi đó, chúng ta sẽ return giá trị được chứ trong $this->items.
Hàm offsetSet được gọi khi chúng ta gán một giá trị cho collection. VD: $collection['key1'] = ''key1"; Khi đó, chúng ta sẽ gán giá trị truyền vào cho $this->items.
Hàm offsetUnset sẽ được gọi khi chúng ta sử dụng hàm unset. VD: unset($collection['key1']). Tương tự, chúng ta cũng sẽ gọi hàm unset với $this->items.
Hàm offsetExists sẽ được gọi khi chúng ta gọi hàm isset để kiểm tra một key. Khi đó chúng ta sẽ gọi hàm isset để kiểm tra key trong $this->items. 2. Các phương thức bổ trợ Như chúng ta thấy, các thao tác với collection đều sử dụng $this->items, một instance của ArrayIterator. Tuy nhiên chúng ta lại không thể gọi các phương thức của ArrayIterator trong một thể hiện của collection. Hàm sau đây sẽ giải quyết điều đó: Như chúng ta thấy, các thao tác với collection đều sử dụng $this->items, một instance của ArrayIterator. Tuy nhiên chúng ta lại không thể gọi các phương thức của ArrayIterator trong một thể hiện của collection. Hàm sau đây sẽ giải quyết điều đó:
Hàm sẽ được kích hoạt khi gọi các phương thức không thể truy cập trong collection. Khi đó, chúng ta sẽ kiểm tra xem method đó có trong $this->items hay không, nếu có thì return method trong $this->items. Chúng ta cũng có thể thêm các phương thức để collection có thể sử dụng giống một array hơn. VD
3. Test Cuối cùng, chúng ta tạo một file php để test collection.
Tham khảo toàn bộ file tại đây Đây là lần đầu viết bài, không thể tránh khỏi các sai sót. Mong được mọi người chỉ bảo thêm. Xin chân thành cảm ơn ) ). |