© 2026 Laravel

Traits & Abstract Classes: Khi nào Composition thắng Inheritance?

1 phút đọc
#php #oop #traits #composition #clean-code

Mục lục bài viết

Sử dụng các mục để điều hướng nhanh

#1. Bản chất

  • Abstract Class: Dùng cho quan hệ “IS-A” (ví dụ: Admin là một User).
  • Traits: Dùng cho hành vi “CAN-DO” (ví dụ: User có thể HasApiTokens). Trait giúp tránh thảm họa đa kế thừa trong PHP.

#2. Code mẫu

trait Loggable {
    public function log(string $msg) { /* ... */ }
}

class Order {
    use Loggable; // Composition qua Trait
}

#3. Mẹo phỏng vấn

Q: Trait khác Interface thế nào? A: Interface định nghĩa HỢP ĐỒNG (cần implement hàm nào), Trait định nghĩa LOGIC (code thực tế để tái sử dụng).

Q: Trait có thể gây xung đột tên không? A: Có, nếu 2 Trait cùng có phương thức tên giống nhau. Phải dùng cú pháp use T1, T2 { T1::method insteadof T2; } để giải quyết.

Bài viết liên quan