I am passionate about adopting new technologies and thrive in dynamic environments.

Telegram

@hxdvn

Social Links

Web Development

Trait trong PHP và lý do nó được sinh ra

Như các bạn đã biết, OOP trong PHP chỉ cho phép kế thừa (inherit) một class từ một và chỉ một class khác duy nhất (đơn kế thừa). Đôi khi chúng ta muốn kế thừa thêm các methods ở nhiều hơn một class nhưng lại vi phạm nguyên tắc trên.

Trait trong PHP và lý do nó được sinh ra

Chúng ta cần một giải pháp để giải quyết vấn đề đa kế thừa của OOP trong PHP. Và thế là Traitra đời!

Vậy thì Trait là gì?

Trong PHP, traitlà một tính năng mới được thêm vào từ PHP version 5.4.

Trait được sinh ra để giải quyết vấn đề đa kế thừa trong OOP, Trait cho phép tái sử dụng code mà không cần sử dụng kế thừa hoặc khai báo một class cha chung, giúp giảm thiểu sự phức tạp và tăng tính tái sử dụng mã. 

Trait giống như một class trừu tượng, nhưng không thể khởi tạo thành đối tượng.

Sử dụng Traitnhư nào cho đúng?

Ví dụ, nếu bạn có một class Uservà một class Articlemà cả hai cần sử dụng một method log()để ghi lại các hoạt động của người dùng, bạn có thể tạo ra một trait Loggervà sử dụng nó trong cả hai class.


trait Logger
{
    public function log($message)
    {
        // code to log message
    }
}
Trait Logger
class User
{
    use Logger;

    public function register()
    {
        $this->log('User registered.');
    }
}
Sử dụng trong class User
class Article
{
    use Logger;

    public function publish()
    {
        $this->log('Article published.');
    }
}
Sử dụng trong class Article

Khi sử dụng traittrong PHP, có một số rủi ro có thể xảy ra nếu bạn lạm dụng hoặc sử dụng chúng không đúng cách, sau đây là một số ví dụ: 

  • Khó debug: Sử dụng quá nhiều traitcó thể gây rối hoặc khó hiểu cho người đọc code vì nó có thể dẫn đến việc ghi đè nhiều phương thức và thuộc tính. Nó cũng có thể gây khó khăn trong việc maintain vì không thể xác định nguồn gốc của phương thức hoặc thuộc tính.
  • Dễ gây xung đột: Nếu hai hoặc nhiều traitcung cấp các phương thức cùng tên, nó có thể gây ra xung đột và các lỗi không mong muốn.

Để giải quyết vấn đề xung đột, chúng ta có thể xử lý như sau: 

Cách 1: Sử dụng từ khóa asđể đặt tên mới cho phương thức trong class.

trait Logger
{
  public function create()
  {
    echo 'Created logger!';
  }
}

trait Event
{
  public function create()
  {
    echo 'Created Event!';
  }
}

class Article
{
  use Logger {
    Logger::create as traitLogger;
  }
  use Event {
    Event::create as traitEvent;
  }
}

$article = new Article();
$article->traitEvent(); // Output: Created Event!
$article->traitLogger(); // Output: Created logger!
Sử dụng từ khóa as để đặt tên mới cho phương thức trong class

Cách 2 : Sử dụng từ khóa insteadofđể xác định trait nào sẽ được sử dụng

trait Logger
{
  public function create()
  {
    echo 'Created logger!';
  }
}

trait Event
{
  public function create()
  {
    echo 'Created Event!';
  }
}

class Article
{
  use Logger;
  use Event {
    Logger::create insteadof Event;
  }
}

$article = new Article();
$article->create(); // Output: Created Event!
Sử dụng từ khóa insteadof để xác định trait nào sẽ được sử dụng

Kết luận:

Traitlà một công cụ hữu ích cho việc chia sẻ mã giữa các class. Nó cho phép bạn tái sử dụng mã trong nhiều lớp mà không cần kế thừa hoặc sử dụng các pattern khác nhau.

Tuy nhiên, cần lưu ý rằng traitchỉ hỗ trợ tái sử dụng mã, nhưng không hỗ trợ kế thừa đa cấp. Hơn nữa việc lạm dụng hoặc traitcó thể gây ra nhiều lỗi không mong muốn. Do đó, khi sử dụng trait, bạn cần phải cân nhắc kỹ.

Trait, php, laravel, oop, tips, Trait trong PHP, Traits, PHP Traits, PHP Traits là gì ?, Cách sử dụng Trait, Trait là gì
4 min read
Nov 29, 2024
By Xuân Dũng Hồ
Share

Related posts

Mar 01, 2026 • 8 min read
Quản lý nhiều dự án và hàng chục người cùng lúc mà không phát điên, câu trả lời của tôi cho câu hỏi "sếp giao thêm dự án mới, nên từ chối hay không?"

Hế nô anh em, lại cuối tuần rồi, lại rảnh nên tôi viết cái bài này. Ma...

Feb 23, 2026 • 14 min read
Đôi khi, quyết định chuyên nghiệp nhất là nói "không" với công nghệ hay nhưng không phù hợp.

Quyết định kiến trúc tốt nhất không phải cái fanciest. Nó là cái giải...

Jan 18, 2026 • 2 min read
Locado - Quản lý local domain giao diện GUI cho anh em lười gõ lệnh

Mệt mỏi vì phải dùng các công cụ dòng lệnh phức tạp chỉ để ánh xạ các...

Your experience on this site will be improved by allowing cookies.