PHP trait
PHP dasturlash tilining muammolaridan biri — bu faqat bitta klassdan meros ola bilishdir. Ya’ni siz biror klass yaratmoqchi bo’lsangiz faqat bitta boshqa klassdan meros olish mumkin xolos degani.
Biroq, agar bir nechta klassdan bir vaqtning o’zida meros olishning imkoni bo’lganda, bu ancha ish samaradorligini oshirgan bo’lardi. Misol uchun, biz bitta klassni bir nechta klassdan meros olib yaratganimizda, ajdod klasslarda mavjud bo’lgan, oldindan yozib qo’yilgan metodlarning kodlarini duplikat qilmay ishlatishimiz imkoni bo’lgan bo’lardi.
PHP 5.4 versiydan boshlab Trait nomi bilan tanish bo’lgan tilning yangi xususiyati qo’shildi. Trait – bu Mixin*ga o’xshash bo’lib, siz Trait klasslarni yaratayotgan klassingiz ichida aralash holatda ishlatishingiz mumkin. Bu degani siz kodlarni qayta yozishdan qutulasiz deganidir.
Mixin haqida ma’lumot —
https://en.wikipedia.org/wiki/Mixin
Ushbu maqolada siz Traitlarni loyihangizda qanday ishlatishni ko’rasiz
PHP Traitlar nima?
Traitlar – bu siz boshqa klasslarda ishlatish uchun oldindan yaratib qo’yiladigan metodlar guruhi. Abstract klassga o’xshab, Traitning o’zini ishlatib bo’lmaydi.
Traitga misol:
trait Sharable { public function share($item) { return 'Buni baham ko`ring'; } }
Yuqorida yaratgan Traitimizni boshqa klassning ichida quyidagicha ishlatishimiz mumkin:
class Post { use Sharable; } class Comment { use Sharable; }
Endi, agar siz Comment va Post klasslaridan yangi obyekt yaratsangiz, bu ikkala obyektda share() metodi mavjud bo’ladi.
$post = new Post; echo $post->share("); // 'Buni baham ko`ring $comment = new Comment; echo $comment->share("); // 'Buni baham ko`ring
Traitlar qanday ishlaydi?
Yuqoridagi misolda ko’rganingizdek, share() metodini e’lon qilmagan bo’lsak ham, Post va Comment klasslarining ikkalasida ham bu metod mavjud.
Traitni oddiy qilib tushuntiradigan bo’linsa, u ish jarayonida kodni ‘nusxalash va qo’yish'(‘copy and paste’) degani bo’ladi. Buning ma’nosi – Trait Post va Comment klasslari ichiga nusxalanadi va qachon siz yangi obyekt yaratganingizda Traitda mavjud bo’lgan metod(bizning misolda share()) yuqoridagi klasslardan olingan obyektlarda ham mavjud bo’ladi.
Traitlarning Abstrakt klasslardan farqi nimada?
Traitlar abstract klasslardan farq qiladi. Chunki Traitlardan meros olib bo’lmaydi.
Faraz qiling, Post va Comment metodlari AbstractSocial klassidan meros olingan. Biz ijtimoiy tarmoqlardagi maqola(post) va izoh(comment)larni baham ko’rish(share)dan ko’ra ko’proq ish qilmoqchimiz. U holda biz bir nechta klassdan quyidagi ko’rinishda bir biridan meros olishimizga to’g’ri keladi:
class AbstractValidate extends AbstractCache {} class AbstractSocial extends AbstractValidate {} class Post extends AbstractSocial {}
Bunday murakkab meros olishlar ancha «yoqimsiz» va ishlatish uchun biroz qiyin bo’ladi. Masalan, agar bizda ijtimoiy tarmoqda baham ko’rish kerak bo’lmaydigan Message degan obyekt bo’lsa, u holda bu klass uchun umuman boshqacha meros olish strukturasi kerak bo’ladi.
Traitlarning interfeyslardan farqi nimada?
Traitlar Interfeyslarga juda o’xshaydi. Traitlar ham, Interfeyslar ham ancha sodda, tushunarli. Biroq, ular orasida ikkita asosiy farq bor.
Interfeysning sharti shundagi u «ushbu obyekt aynan mana bu ishlarni qila oladi» deydi. Traitlar esa obyektga o’zidagi metodlardan foydalanish imkonini taqdim qiladi.
Masalan:
// Interface interface Sociable { public function like(); public function share(); } // Trait trait Sharable { public function share($item) { // Ushbu ma`lumotni baham ko`r } } // Class class Post implements Sociable { use Sharable; public function like() { // } }
Bu misolda bizda Sociable interfeysi mavjud bo’lib, bunda u Post klassidan obyektga faqat like() va share() metodlaridan foydalanishi mumkinligini aytadi.
Sharable Traiti esa share() metodini Postdan olingan obyektga taqdim qiladi va u ushbu obyekt like() metodini ishlatish imkonini ham beradi.
$post = new Post; if($post instanceOf Sociable) { $post->share('Salom dunyo'); }
Traitning qanday foydasi bor?
Traitning foydasi kodning duplikat bo’lishini oldini oladi.
Traitning kamchiliklari nimada?
Traitda foydali tomonlari bilan birga kamchiliklari ham mavjud. Traitlar klassga juda ko’p metodlarni yuklab yuborishi mumkin. Oldin aytilaganidek, Traitlar klasslar orasidagi «nusxalangan va qo’yiladigan» kodlar. Bunda klassga turli xildagi metodlar guruhi qo’shilib ketadi va natijada yagona javobgarlik prinsipi(single responsibility principle —
https://en.wikipedia.org/wiki/Single_responsibility_principle) buziladi.
Yana boshqa kamchiligi – bir biriga xalaqit berayotgan metodlarni topish uchun klassning kodini o’qish paytingizda undagi barcha o’zaro ustma-ust tushgan(konflikt beradigan) metodlarni topish muammosi paydo bo’ladi.
Manba:
Web Dasturlash
PHP trait