Hướng dẫn traits in php laravel
Bài viết này được dịch từ nguồn What are PHP Traits? có thêm phần chém gió của tác giả bài dịch hy vọng có thể truyền tải cho các bạn chút hiểu biết về Show Trong nội dung bài viết này chúng ta sẽ cùng tìm hiểu thế nào là Giới thiệuKhi làm việc với PHP, một trong những vấn đề có thể chúng ta đã từng thắc mắc, đã từng gặp phải, đó là việc ta chỉ có thể kế thừa (extends) từ một class cha mà thôi. Tuy nhiên, nhiều lúc việc kế thừa từ nhiều class lại rất có ích. Chúng ta có thể sử dụng lại các phương thức ở các class khác nhau để tránh việc lặp code. Ví dụ tôi có một class A mang phương thức X, đồng thời tôi lại có class B mang phương thức Y. Tôi phải thiết kế một class C mang phương thức Z đồng thời muốn sử dụng lại phương thức X và Y nói ở trên. Tôi phải làm thế nào trong khi tôi là PHP Coder mà ông PHP lại không hỗ trợ tôi đa kế thừa @@ Một giải pháp "chày cối" là cho class C kế thừa từ class B (tôi sử dụng được Y) rồi lại cho class B kế thừa từ class A (tôi sử dụng được X). Tuy nhiên đây mới là ví dụ đơn giản với hai class A và B, trường hợp mà yêu cầu cần dùng nhiều phương thức ở nhiều class khác nhau hơn thì việc kế thừa như tôi nói ở trên lại trở thành một thảm họa (huhuhu). Nhận ra sự bất cập này, trong bảng PHP 5.4 đã đưa ra một khái niệm, và đó chính là Traits là gì?
Hãy cùng thử cài đặt một ví dụ đơn giản bằng việc thiết kế một Trait:
Và sử dụng trong các class khác:
Bạn có thể tưởng tượng việc sử dụng Trait như trên giống như việc chúng ta viết phương thức
Traits hoạt động như thế nào?Như bạn đã thấy ở bên trên thì cả hai object của class
Traits khác với Abstract Class thế nào?Trait khác với Abstract Class vì nó không dựa trên sự thừa kế. Tưởng tượng rằng nếu class Post và class Comment phải kế thừa từ một AbstractSocial class. Chúng ta dường như muốn nhiều hơn là chỉ share post và comment lên mạng xã hội. Tuy nhiên việc sử dụng abstract class khiến chúng ta phải xây dựng một mô hình kế thừa hết sức phức tạp như sau:
Traits khác với Interfaces thế nào?Có thể nói về cơ bản thì
Ta hãy cùng đi vào một ví dụ cụ thể như sau:
Chúng ta có interface Bạn có thể thấy chúng ta có thể type hint đối tượng
Dùng Traits có lợi thế nào?
Nhược điểm của Traits
Những tình huống cụ thể sử dụng TraitsTa sẽ tự đặt ra câu hỏi là trong tình huống nào sử dụng Trait sẽ là giải pháp hay? Tôi nghĩ Trong các ứng dụng mạng xã hội, tưởng tượng rằng chúng ta có các đối tượng Tuy nhiên,
Đối tượng
Các câu hỏi đặt ra cho chúng ta như sau:
Giải pháp của chúng ta nên thực hiện đó là implement phương thức Ví dụ cụ thể về việc sử dụng TraitTrong bài viết của tác giả có lấy ví dụ về package Cashier trong Laravel, tuy nhiên tôi xin phép không phân tích về package này vì có thể có người chưa từng sử dụng nó (bản thân tác giả của bài viết này cũng chưa sử dụng). Tôi xin giới thiệu với các bạn về một tính năng mà vốn Laravel đã có từ những phiên bản 4.x trong đó có sử dụng Về Soft Delete thì bạn có thể tưởng tượng như chức năng thùng rác trên hệ điều hành của chúng ta. Khi chúng ta xóa, dữ liệu sẽ vào thùng rác. Bạn hoàn toàn có thể recover dữ liệu đó hoặc vào thùng rác xóa hẳn dữ liệu khỏi ổ cứng. Như vậy là ta đã có cái nhìn tổng quan về Soft Delete rồi, giờ ta sẽ đi sâu vào xem Laravel họ xử lý vấn đề này thế nào? Sử dụng Trait ra sao? Tôi sẽ dùng tài liệu tham chiếu của phiên bản Laravel 5.2. Ta sẽ tìm hiểu về cách cài đặt Soft Deleting:
Đây là một Model
Flow sử dụng Soft Delete hết sức đơn giản:
Thật là kỳ diệu phải không? Có hai hàm mà giải quyết được bài toán của chúng ta rất gọn gàng, hãy cùng mổ xẻ thêm Trait SoftDeletes có những gì để có câu trả lời. Trước hết hãy nói chuyện đến trường hợp các Model bình thường không sử dụng Soft Delete, ngay trong Base Model mà tôi nói ở trên đã chứa các hàm dùng để delete mà ta có thể sử dụng lại, cụ thể như sau:
Như vậy thì với một Model bình thường (không sử dụng Soft Delete), ta vẫn sử dụng được cả hai hàm Case bình thường ta đã clear đúng không nào? Giờ hãy xem điều vi diệu khi sử dụng Trait SoftDeletes. Ta vẫn focus vào hai hàm đã nói ở trên:
Như vậy ta đã hiểu hơn về cơ chế thực hiện Soft Delete của Laravel với sự trợ giúp của
Có thể đưa ra kết luận ngắn
gọn như sau: việc sử dụng Kết luậnCâu hỏi lớn đặt ra: chúng ta có nên sử dụng Traits cho phép chúng ta thêm các chức năng, phương thức vào class mà không làm phức tạp hay lặp code trong class. Traits không phải là câu trả lời cho tất cả những vấn đề mà bạn gặp phải với đa kế thừa. Sử dụng Trait không hợp lý là một quyết định tồi. Nếu bạn dự định biến class của mình thành một siêu anh hùng class có thể giải quyết mọi vấn đề bằng cách sử dụng Trait, bạn nên xem lại vì bạn có thể sẽ vi phạm nguyên tắc SRP. Trong việc phát triển phần mềm, cũng có những tình huống đúng và sai khi sử dụng các thành phần hay những pattern có sẵn. Tài liệu tham khảo
|