OOP - Traits

🔹 Trait چیست؟

  • در PHP، کلاس‌ها فقط می‌تونن از یک کلاس والد ارث‌بری کنن (Single Inheritance).

  • برای حل این محدودیت، Traits معرفی شدن.

  • Trait به شما اجازه میده مجموعه‌ای از متدها رو تعریف کنید و اون‌ها رو در چند کلاس مختلف استفاده کنید.

🔹 تعریف یک Trait

<?php trait Logger { public function log($msg) { echo "Log: $msg"; } }

📌 یک Trait شبیه کلاس تعریف میشه، اما به جای class از trait استفاده می‌کنیم.

🔹 استفاده از Trait در کلاس

<?php trait Logger { public function log($msg) { echo "Log: $msg"; } } class User { use Logger; } $user = new User(); $user->log("User created!"); ?>

📌 خروجی:

Log: User created!

🔹 استفاده از چندین Trait

<?php trait Logger { public function log($msg) { echo "Log: $msg<br>"; } } trait ErrorHandler { public function error($msg) { echo "Error: $msg<br>"; } } class App { use Logger, ErrorHandler; } $app = new App(); $app->log("Application started"); $app->error("Something went wrong!"); ?>

📌 خروجی:

Log: Application started Error: Something went wrong!

🔹 Override کردن متد Trait در کلاس

اگر متدی در کلاس تعریف بشه که هم‌نام با متد Trait هست، متد کلاس اولویت بیشتری داره:

<?php trait Logger { public function log($msg) { echo "Trait Log: $msg<br>"; } } class User { use Logger; public function log($msg) { echo "Class Log: $msg<br>"; } } $user = new User(); $user->log("Test message"); ?>

📌 خروجی:

Class Log: Test message

🔹 استفاده از insteadof و as

وقتی چند Trait متد هم‌نام داشته باشن، می‌تونیم مشخص کنیم کدوم استفاده بشه:

<?php trait A { public function hello() { echo "Hello from A<br>"; } } trait B { public function hello() { echo "Hello from B<br>"; } } class MyClass { use A, B { A::hello insteadof B; // متد A اجرا میشه B::hello as helloB; // متد B هم با نام جدید در دسترسه } } $obj = new MyClass(); $obj->hello(); // خروجی: Hello from A $obj->helloB(); // خروجی: Hello from B ?>

✅ خلاصه

  • Traits راهی برای استفاده‌ی چندباره از متدها در کلاس‌های مختلف هستند.

  • یک کلاس می‌تونه چندین Trait داشته باشه.

  • متدهای کلاس روی متدهای Trait اولویت دارند.

  • میشه با insteadof و as مدیریت کرد که کدوم متد استفاده بشه.