Trait là gì? Cách sử dụng Trait trong PHP

Vậy trait là gì? Trong hướng đối tượng, Traits là một cơ chế để tái sử dụng code trong các ngôn ngữ đơn kế thừa như PHP. Một Trait nhằm giảm hạn chế của sự đơn thừa kế bằng cách cho phép nhà phát triển sử dụng lại các bộ phương thức một cách tự do trong một số lớp độc lập trong các hệ thống phân cấp lớp khác nhau.

Một Trait tương tự như một lớp (Class), nhưng chỉ nhằm mục đích nhóm chức năng một cách chi tiết và nhất quán. Và nó không có khả năng khởi tạo ví dụ: new class ABC(). Nó là một sự bổ sung cho sự thừa kế truyền thống (đơn kế thừa) trong ngôn ngữ PHP.

vi du trait la gi trong php

Trait hoạt động như thế nào:

Chúng ta sẽ cùng nhau tìm hiểu về cách hoạt động của Trait trong ví dụ bên dưới:

class A extends D
{
    public function showMessage(){
        echo 'Class A';
    }
}

class B extends D
{
    use FullMessage;
    public function showMessage(){
        echo 'Class B';
    }
}

class C extends E
{
    use FullMessage;
    public function showMessage(){
        echo 'Class C';
    }
}

trait FullMessage
{
    public function showMessage(){
        echo 'This is';
    }
}

Ở đây mình có hai Class AClass B cùng kế thừa một Class D, Class C kế thừa Class E. Nếu muốn thêm dòng chữ This is cho hai Class BClass C, mình chỉ việc tạo một Trait FullMessage xuất thêm dòng chữ This is và use nó ở hai Class trên.

Tại sao mình cần phải sử dụng Trait, vì nó ở đây đóng góp như một “Class” chứa những hàm bổ sung mình cần cho Class mình cần sử dụng và bản thân Class CClass B ở đây cùng kế thừa từ hai cha khác nhau. Do sự kế thừa khá phức tạp nên để đơn giản hoá chúng ta có thể sử dụng Trait để giải quyết vấn đề này.

Trait có giống Interface?

Sau khi hiểu Trait là gì, thì một câu hỏi đặt ra là Trait có giống như Interface(Interface là gì mình sẽ đề cập vào bài viết khác, nếu có anh em chưa biết). Nhìn tổng quan TraitInterface đều là tổng hợp một list các function và nhìn khá đơn giản.

Nhưng Interface khác là vì nó được xem như một giao kèo giữa nó và Class implements chính nó. Ví dụ:

class A implements D
{
    public function showMessage(){
        echo 'Class A';
    }
}

interface D
{
    public function showMessage() : string
}

Ở đây Class A giao kèo với interface D là nó chỉ được có một hàm duy nhất là hàm showMessage và kết quả hàm này là một string. Interface có giá trị “sử dụng” nó không được dùng để lấy các hàm bên trong nó để sử dụng mà nó được xem là một giao ước để cam kết sự chặt chẽ trong Class mà bạn implements nó.

Và thường thì từ khoá đi cùng với interface sẽ là implements. Còn với Trait thì sẽ là từ khoá use.

Kết luận:

Sau khi tìm hiểu một vòng quanh trái đất về Trait là gì, mình biết các anh em đang rối não và không hiểu tạo sao PHP lại để ra lắm thứ thế. Nhưng theo mình nghĩ các gì nó cũng sẽ có lí do của nó. Có thể thời gian đầu bạn sẽ chưa hiểu, nhưng tin mình đi khi bạn đã thực hành trong việc coding nhiều. Rồi sẽ đến lúc bạn sẽ biết tại sao mình cần nó.

Bản chất Trait nó giúp chúng ta giải quyết được vấn đề đa kế thừa, một Class có thể kế thừa được nhiều Class. Nhưng không có nghĩa là bạn có thể sử dụng nó tự do, mình nghĩ cái gì cũng vừa đủ thì nó sẽ tốt hơn.

Thân chào và quyết thắng hẹn gặp lại các anh em trong một bài viết khác vào một ngày không xa. Web mình có PWA, anh em nhớ sài nha, để lướt web nhanh hơn trên mobile. Cách thêm PWA bằng Add to homescreen nha anh em.

Xin chào các đồng chí tôi là Phạm Phi Hùng, tác giả của blog Hung Pham Dev Web Tôi là một Front-end Developer, kiêm writer, quay phim dạo, sửa máy dạo và làm một số ngành nghề khác nữa

Site Footer