TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #22 804
تریت‌ها (Traits) در PHP، مکانیزمی انعطاف‌پذیر برای اشتراک‌گذاری متدها بین کلاس‌ها هستند. تریت‌ها به شما اجازه می‌دهند کد های مشترک را به اشتراک بگذارید، بدون آنکه محدودیت‌های ارث‌بری را به همراه داشته باشند.

چگونگی استفاده از تریت‌ها:
تریت‌ها با استفاده از کلمه کلیدی trait تعریف می‌شوند. شما می‌توانید درون تریت، متدها و خصوصیاتی را تعریف کنید که می‌خواهید بین چندین کلاس به اشتراک گذاشته شوند.

برای استفاده از تریت در یک کلاس، از کلمه کلیدی use داخل کلاس استفاده کنید. این کار تمام متدها و خصوصیات تعریف شده در تریت را در دسترس کلاس قرار می‌دهد.

مثال:
فرض
کنید می‌خواهیم علاوه بر توانایی لاگ کردن، قابلیت ثبت تاریخچه را نیز به چندین کلاس اضافه کنیم. می‌توانیم از دو تریت استفاده کنیم:

trait LoggerTrait {
public function log($message) {
echo "Log: $message\n";
}
}

trait HistoryTrait {
protected $history = [];

public function addHistory($event) {
$this->history[] = $event;
}

public function getHistory() {
return $this->history;
}
}

class UserActivity {
use LoggerTrait, HistoryTrait;

public function login($username) {
$this->log("User logged in: $username");
$this->addHistory("Login at " . date('Y-m-d H:i:s'));
}
}
// Other Classses ...

$userActivity = new UserActivity();
$userActivity->login('JohnDoe');
print_r($userActivity->getHistory());

Log: User logged in: JohnDoe

Array
(
[0] => Login at 2024-03-30 14:26:04
)


در این مثال، ما دو تریت LoggerTrait و HistoryTrait را تعریف کرده‌ایم. سپس، در کلاس UserActivity، از هر دو تریت با استفاده از کلمه کلیدی use استفاده کرده‌ایم. این کار به UserActivity امکان می‌دهد که هم از متدهای لاگ کردن و هم از قابلیت‌های مربوط به ثبت تاریخچه استفاده کند.

استفاده از تریت‌ها با حل تعارض:
گاهی اوقات، دو تریت ممکن است متدهایی با نام یکسان داشته باشند. PHP امکان مدیریت این تعارض‌ها را با استفاده از عبارت insteadof فراهم می‌آورد. همچنین، می‌توانید با استفاده از عبارت as نام یک متد را در کلاس استفاده‌کننده تغییر دهید.
trait A {
public function doSomething() {
echo "Doing something from A\n";
}
}

trait B {
public function doSomething() {
echo "Doing something from B\n";
}
}

class SampleClass {
use A, B {
A::doSomething insteadof B;
// استفاده از متد doSomething از تریت A و نادیده گرفتن آن از تریت B
B::doSomething as doSomethingFromB;
// تغییر نام متد doSomething از تریت B به doSomethingFromB
}
}

$sample = new SampleClass();
$sample->doSomething();
// Doing something from A
$sample->doSomethingFromB();
// Doing something from B

در این مثال، کلاس SampleClass هر دو تریت A و B را استفاده می‌کند. از آنجا که هر دو تریت متدی با نام doSomething دارند، ما با یک تعارض مواجه هستیم.
برای حل این تعارض، ما از عبارت insteadof استفاده می‌کنیم تا مشخص کنیم که می‌خواهیم از پیاده‌سازی متد doSomething در تریت A استفاده کنیم و پیاده‌سازی آن در تریت B را نادیده بگیریم.
همچنین، با استفاده از عبارت as، متد doSomething از تریت B را به doSomethingFromB تغییر نام می‌دهیم تا همچنان بتوانیم به آن دسترسی داشته باشیم، اما با نام جدید.

👤 AmirHossein

💎 Channel: @DevelopixPHP
  • 🔥 9
  • 👍 2
More from @developixphp
  1. Sep 26, 2026این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟ 🔖 #PHP #پی_اچ_پی 👤 Developix 💎 Channe…
  2. Sep 25, 2026🔥 پکیج: قراردادهای ترجمه سیمفونی اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق بر…
  3. Sep 16, 2026🚀 ‏LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  4. Sep 11, 2026ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP…
  5. Sep 10, 2026برنامه نویسی سوکت در PHP بخش اول عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از س…
  6. Aug 31, 2026🔥 پکیج: استاندارد PSR-11 برای Container استاندارد PSR-11 فقط یه interface مشترک برای Cont…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →