Trait چیست ؟

۲۲ شهریور ۱۳۹۸
Traits in php

یکی از مشکلاتی که در زبان PHP وجود دارد و در زبان های دیگر هم این موضوع وجود دارد عدم ارث بری یک کلاس از چندین کلاس است. یعنی در آن واحد کلاس شما میتواند از یک کلاس ارث بری کند در صورتی که در بعضی از مواقع کلاس شما نیاز دارد از چندین کلاس ارث بری کند. خب این موضوع چه اثری دارد؟ قاعدتا ارث بری متدها از چندین کلاس مختلف برای بهینه نوشتن کد ها مطلوب تر است. مثلا شما یک تکه کد دارید که در چند کلاس نیاز هست که استفاده شود حال در یک کلاس به خصوص از این تکه کد باید استفاده کنید و همچنین از تابع دیگری که در کلاس دیگر نوشته شده است نیز باید استفاده کنید.

خب راه حل چیست؟

در PHP 5.4 یک ویژگی جدید به نام Trait  افزوده شد که دقیقا این مشکل را برای ما حل میکند و در حقیقت کاربرد اصلی اونها از بین بردن محدودیتی بود که کلاس های php  با آن روبه رو بودند و اون محدودیتی بود که در بالا به آن اشاره کردیم. الان با استفاده از فراخوانی یک trait در واقع میتونیم بگیم داریم ازیک کلاس ارت بری کنیم.

به زبان ساده Traits ، یک گروه از متدها است که می خواهید در کلاس دیگری قرار دهید. برای استفاده از آنها کافیست در اول فایل بنویسید trait. به همین سادگی!

فرض کنید یک کلاس User داریم و قرار است از یک سری مجموعه تابع که نقش ها و مجوز های کاربر را بررسی میکنند استفاده کنیم:

خب حالا دوتا Trait جدید میسازیم و کدهای خودمون رو داخل آنها قرار میدهیم:

حالا Trait دوم را هم پیاده سازی میکنیم:

حالا در این قسمت کلاس User را به صورت زیر بازنویسی میکنیم:

یعنی فقط کافی است با استفاده از کلمه کلیدی use آنها را در کلاس خود قرار دهید. شما هر تعداد  Trait را که نیاز داشته باشید میتوانید در کلاس های خود استفاده کنید.

برای دسترسی به trait و توابع داخلی آن نیز مثل توابعی که از یک کلاس معمولی ارث بری و استفاده میشوند از آنها استفاده میکنیم:

 

خوب است بدانید میتوانید از یک trait در داخل trait دیگر استفاده کنید مثلا :

 

در داخل trait ها میتوانید از توابع بدون بدنه استفاده کنید :

 

آخرین نکته ای که باید در مورد trait ها بدانید تلاقی نام های توابع داخل آنها است یعنی به عنوان مثال حالتی را فرض کنید که یک تابع داخل چندین trait یک نام را دارد و موقع استفاده برنامه متوجه نمیشود از کدام تابع در کدام trait باید استفاده کند. این مشکل را به صورت زیر در برنامه حل میکنیم:

 

در بالا مشاهده میکنید که دو trait مختلف یک تابع همنام دارند. حالا میخواهیم در کلاس از هر کدام از این توابع استفاده کنیم

 

 

با استفاده از کلمه  insteadof مشخص میکنیم از کدام ‌trait تابع را صدا بزند و با استفاده از as به تابع نام مستعار میدهیم و میتوانیم از آن در برنامه خودمان استفاده کنیم.

0
برچسب ها :
نویسنده مطلب علی فلاحتی

بدون دیدگاه

لینک های مفید