یکی از مشکلاتی که در PHP به عنوان یک زبان برنامه نویسی وجود دارد این است که تنها می تواند یک ارث بری داشته باشد. این به این معنی است که یک کلاس تنها می تواند از یک کلاس دیگر ارث ببرد.با این حال، در بسیاری از مواقع ارث بری از چندین کلاس می تواند مفید باشد. به عنوان مثال،ارث بری متدها از چندین کلاس مختلف برای چلوگیری از تکرار کدها مطلوب و پرکاربرد است.
در PHP 5.4 یک ویژگی جدید به نام Traits افزوده شد که یک صفت نوعی مانند Mixin است که اجازه می دهد کلاس های Trait را به یک کلاس موجود اضافه کنید. این بدان معنی است که شما می توانید کدهای تکراری را کاهش دهید و مزیت های زیادی را ضمن اجتناب از مشکلات ارث بری چندگانه به دست آورید.
در این مقاله می خواهیم به بررسی Traits بپردازیم و نحوه استفاده از آن را در پروژه های PHP توضیح دهیم.

PHP Traits چیست ؟

به زبان ساده Traits ، یک گروه از متدها است که می خواهید در کلاس دیگری قرار دهید.
یک مثال از Trait :

سپس می توانید این Trait را در کلاس های دیگر قرار دهید:

الان می توانید ببینید که برای ایجاد اشیاء جدید از این کلاس ها ، هر دو ، متد ()share دارند:

چگونه Traits کار می کنند؟

همانطور که می توانید در مثال بالا مشاهده کنید، هر دو شیء Post و Comment متد ()share را دارند حتی اگر این متد تعریف نشده باشد.

اساسا Traits ، یک راه برای copy و paste کردن کد در طول زمان اجرا است.
این به این معنی است که Traitsدر کلاس های Post و Comment کپی می شود، بنابراین هنگامی که نمونه ای جدید ایجاد می کنید، کد متد ()share در دسترس خواهد بود.

تفاوت Traits و Abstract Class ها :

Traits متفاوت از یک Abstract Class است (کلاس های انتزاعی چیست؟) چون آنها به ارث بری تکیه نمی کنند.
تصور کنید اگر کلاس Post و Comment بتواند از یک کلاس AbstractSocial به ارث برسند. ما به احتمال زیاد بیشتر از قراردادن پست ها و نظرات در وبسایت های رسانه های اجتماعی می خواهیم به اشتراک بگذاریم، بنابراین به یک درخت ارث بری پیچیده خواهیم رسید:

این وراثت پیچیده بسیار پیچیده و گیج کننده است،و زمانی پیچیده تر میشود که یک شی ساده ساختار وراثتی مشابهی نداشته باشد . به عنوان مثال، اگر ما یک شیء Message داشته باشیم که نباید به اشتراک گذاری اجتماعی اجازه دهد، این شیء به ساختار ارث بری کمی متفاوت تر نیاز دارد.

تفاوت Traits و Interface ها :

Trait ها نوعی از واسط های کاربری هستند. هر دو آنها معمولا ساده ، مختصر هستند و بدون یک کلاس واقعی پیاده سازی شده کمتر استفاده می شوند. با این حال، تفاوت بین این دو مهم است.
واسط کاربری یک قرارداد است که می گوید: “این شیء می تواند این کار را انجام دهد”، در حالی که یک Trait دادن توانایی انجام دادن کاری به یک شیء است.
برای نمونه :

در این نمونه ما واسط کاربری Sociable را داریم که بیان می کند شیء Post توانایی ()Like و ()Share را دارد.
Sharable Trait متد Like() و Share() پیاده سازی شده در کلاس Post را اجرا می کند.
بنابراین، همانطور که در ادامه می بینید،ما می توانیم اشاره ای داشته باشیم که آیا شیء sociable ,Post است یا خیر (یعنی واسط کاربری sociable را پیاده سازی می کند) ، در حالی که Trait یک روش قابل استفاده مجدد را تعریف می کند که می توان آن را در سایر کلاس های مشابه ترکیب کرد:

مزیت Traits چیست ؟

مزیت استفاده از Traits این است که کدهای تکراری را کاهش می دهد در حالی که از ارث بری کلاس های پیچیده که ممکن است در زمینه درخواست شما حساس نباشد جلوگیری می کند.
به شما اجازه می دهد تا Trait ساده و واضح و مختصر تعریف کنید.

اشکالات Traits چیست؟

علیرغم تمام مزایای گفته شده ممکن است در Traitsها نقاط ضعفی نیز وجود داشته باشد.
Traitها راهی بسیار آسان برای نوشتن کلاس هایی که مسئولیت بیش از حد دارند فراهم می کند. یک Trait اساسا راهی برای “copy and paste” کردن کد میان کلاس ها است . با این حال، Traits ها می توانند ابزار کمکی بسیار فوق العاده ای برای برنامه نویسان تنبل باشد چرا که کافی است برای حل فوری مشکل خود، فقط یک Trait را اضافه کنید.

موقعیت های استفاده از Traits :

مواقعی که استفاده از یک Traits می تواند ایده خوبی باشد، چه وقت خواهد بود؟
Traits یک روش عالی برای استفاده از یک تکه کد بین مجموعه ای از کلاس های مشابه است که نباید از همان کلاس انتزاعی به ارث برده شوند.
در همان مثال کاربرد شبکه اجتماعی که در بالا گفته شد ، تصور کنید که ما برای Post ، Photo ، Note ، Message و Link شیء داشتیم.نسبتا در بیشتر موارد، این اشیاء در سیستم ما قابل تعویض هستند به طوریکه آنها به طور معمول بین کاربران در حال ایجاد و تعامل هستند.
با این حال، Post ، Photo ، Note ، Message و Link شیء هایی هستند که به طور معمول بین کاربران به اشتراک گذاشته می شوند، در حالی که شیء Message پیام های خصوصی هستند که به صورت عمومی منتشر نمی شوند.
شیء های Post ، Photo ، Note ، Message و Link همه واسط کاربری Shareable را اجرا می کنند:

آیا این منطقی است که متد ()share در هر کلاسی که واسط کاربری Shareable را اجرا می کند کپی شود؟ نه
آیا این منطقی است که یک کلاس AbstractShare داشته باشیم که اشیاء را که واسط کاربری Shareable را پیاده سازی می کند ، گسترش دهد؟ نه
آیا این منطقی است که روش ()share به عنوان بخشی از یک کلاس انتزاعی اجرا شود ، اما برای شیء Message مسدود شود؟ نه
آیا این منطقی است که یک Shareable Trait اجرا شود که واسط کاربری را انجام دهد و به راحتی به شیء هایی اضافه شود که به آن نیاز دارد؟ بله

جمع بندی :

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

 
Resource : سایت Culttt


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *