چگونگی استفاده از تریتها:
تریتها با استفاده از کلمه کلیدی
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