Trait trong PHP là một cơ chế giúp tái sử dụng code theo kiểu “copy vào class” thay vì kế thừa. Nó giải quyết vấn đề mà OOP truyền thống (extends) không làm tốt, đó là đa kế thừa (multiple inheritance).
Nói đơn giản
Bạn nên dùng trait khi có những logic dùng chung nhưng không phù hợp để đưa vào class cha.
Ví dụ thực tế
trait LoggerTrait {
public function log($message) {
echo "[LOG] " . $message;
}
}
class UserService {
use LoggerTrait;
}$service = new UserService();
$service->log("Hello Trait");
👉 Khi compile, PHP sẽ copy toàn bộ method của trait vào class
trait LoggerTrait {
public function log($msg) {
echo $msg;
}
}trait CacheTrait {
public function cache($key) {
echo "Cache: " . $key;
}
}class ProductService {
use LoggerTrait, CacheTrait;
}
Nếu 2 trait có cùng tên function → sẽ lỗi, phải resolve
trait A {
public function hello() {
echo "A";
}
}trait B {
public function hello() {
echo "B";
}
}class Test {
use A, B {
A::hello insteadof B; // ưu tiên A
B::hello as helloB; // đổi tên B
}
}
Trait gần giống class, có thể chứa
Trait có thể yêu cầu class phải implement method
trait PaymentTrait {
abstract public function getUser(); public function pay() {
$user = $this->getUser();
echo "Pay for " . $user;
}
}class OrderService {
use PaymentTrait; public function getUser() {
return "Engineer VN";
}
}
Trait dễ làm code rối nếu dùng quá nhiều
👉 Anti-pattern
Trait chỉ là tool hỗ trợ, không phải kiến trúc
Nhìn vào class không biết trait đang kéo theo gì
trait ResponseTrait {
public function success($data) {
return [
'status' => 'ok',
'data' => $data
];
} public function error($msg) {
return [
'status' => 'error',
'message' => $msg
];
}
}class ApiController {
use ResponseTrait;
}
Trait là cách reuse code cực mạnh trong PHP, đặc biệt khi bạn muốn chia nhỏ logic theo module mà không bị giới hạn bởi kế thừa.
Nếu dùng đúng
Nếu dùng sai