مرحباً جميعاً, سنتحدث اليوم عن السمات Traits في لغة PHP, وسنتعرف عن اهميتها وكيفية إستخدامها.
ولكن قبل أن نتحدث عن السمات في لغة PHP, سنقوم أولاً إلقاء نظرة سريعة على الوراثة.
كما تعلمت مسبقاً في المعسكر, في موضوع البرمجة الكينونية بالتحديد, أن PHP هي لغة وراثة وحيدة Single inheritance وليست متعددة Multiple inheritance, أي أنه الكلاس يستطيع أن يرث كلاس واحد فقط وليس أكثر, بمعنى أن الابن يستطيع أن يرث أب واحد.
مع ذلك, في كثير من الأحيان سيكون من المفيد ان يرث الكلاس عدة كلاسات وليس كلاس واحد فقط. على سبيل المثال قد يكون هناك حالة نريد وراثة دوال موجودة في كلاسات متفرقة من أجل منع تكرار الكود البرمجي.
لنفترض أن هناك كلاس شخص Person كالتالي:
وكلاس موظف Employee كالتالي:
الصورة في الأعلى توضح كيف يرث الكلاس موظف Employee الكلاس شخص Person , ولنفترض أن هناك كلاس ثالث يسمى عائلة Family, هذا الكلاس يحتوي على دوال نريد إستخدامها في كلاس موظف, فكيف سنقوم بهذا؟ بالتأكيد لن نقوم بنسخ هذه الدوال من كلاس عائلة Family ووضعها في كلاس موظف Employee لأنه سيصبح هناك تكرار للكود, قد تقول أنه يمكننا أن نجعل كلاس موظف يرث كلاس عائلة, ولكن للأسف لغة PHP لا تدعم الوراثة المتعددة كما ذكرنا, أي ان الكلاس لا يستطيع أن يرث عدة كلاسات, فما هو الحل؟
هنا يأتي دور السمات Traits, السمات تم إضافتها إلى لغة PHP في الإصدار 5.4. وهي طريقة رائعة وسهلة الإستخدام.
السمات مشابه جداً للكلاس, ولكنها تستخدم لتجميع الدوال في ملف واحد بطريقة متناسقة, وقد جاءت لحل مشكلة الوراثة الوحيدة Single inheritance, وقد أعطت إمكانية لإعادة إستخدام الكود وبذلك نمنع التكرار, الأن دعونا نتعرف كيف يمكن إنشاء سمات وإستخدامها والتغلب على مشكلة الوراثة المتعددة.
طريقة إنشاء سمة مشابه لطريقة إنشاء كلاس, ولكن سنقوم بإستبدال كلمة class بكلمة trait .
نقوم بإنشاء سمة عائلة Family كالتالي:
لإستخدام هذه السمة في كلاس Employee نقوم بإستخدام كلمة use, فيصبح كلاس Employee هكذا:
الآن سنقوم بإنشاء ملف رئيسي اسمه index.php لتجربة الكود ولكي نعرف مدى فائدة السمة:
سيكون الناتج كالتالي:
كما رأينا, كلاس Employee ما زال يرث كلاس واحد وهو كلاس Person, ولكننا إستطعنا أيضاً إستخدام خصاص العائلة بإستخدام سمة Family, وبهذا نكون قد تغلبنا على مشكلة الوراثة الوحيدة.
قد تسأل سؤال مهم, وهو لماذا انشأنا السمة اساساً, فقد كنا نستطيع ان نقوم بوضع الكود في كلاس موظف ببساطة. ولكن لنفترض أن هناك كلاس موظف خاص, وكلاس موظف عام, وعدة كلاسات آخرى و جميعها ترث كلاس شخص, وتريد أيضاً أن تستخدم خصائص العائة, ففي هذه الحالة لا يمكننا نسخ ولصق الكود لانه سيصبح هناك تكرار بشكل كبير, بدلاً من ذلك وضعنا جميع الكود الخاص بالعائلة في سمة اسمها عائلة Family, وسنقوم بإستخدامها في أي كلاس يريد أن يستخدم خصائص العائلة.
الآن أنا متأكد أنك عرفت كيف ان السمات مرنة جداً وسهلة الإنشاء والاستخدام كذلك, وأيضاً يوجد العديد والعديد من الميزات الجميلة والمفيدة جداً للسمات, ولكن هذا كل ما تحتاجه للبداية, سنكون سعداء في حال وجود أي إستفسار أو سؤال بخصوص السمات.