Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استخدام سمات متعددة

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 52 من 91.

تكون السمة الواحدة مفيدة، لكن القوة الحقيقية تظهر عندما تجمع عدة سمات في class واحدة. يتيح لك PHP تضمين العدد الذي تحتاج إليه من السمات، مما يمنح class لديك إمكانات من عدة مصادر في آنٍ واحد.

لاستخدام سمات متعددة، ما عليك سوى سردها مفصولة بفواصل بعد الكلمة المفتاحية use:

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

الناتج:

id_6789abc123 - 2024-01-15 10:30:00

تحتوي فئة Post الآن على أساليب من كلتا السمتين. تساهم كل سمة بوظائفها الخاصة - توفر Timestampable أساليب مرتبطة بالوقت، بينما تتولى Identifiable التعامل مع المعرّفات الفريدة. يحافظ هذا النهج على تركيز كل سمة على مسؤولية واحدة، مما يجعل شفرتك أكثر نمطية وقابلية لإعادة الاستخدام.

ماذا يحدث عندما يكون لدى سمتين methods بالاسم نفسه؟ هذه حالة تعارض سنستكشفها في الدرس التالي.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لإدارة المنتجات يجمع بين سمات متعددة لمنح المنتجات إمكانات التسعير وإدارة المخزون. ستتولى كل سمة مسؤولية واحدة، وسيحصل صنف المنتج على الوظائف من كلتيهما.

ستنظّم الشيفرة عبر ثلاثة ملفات:

  • Priceable.php: أنشئ سمة باسم Priceable تتولى وظائف التسعير. يجب أن تحتوي السمة على:
    • خاصية $price خاصة (من النوع float)
    • دالة setPrice(float $price) تخزّن السعر
    • دالة getPrice() تُرجع السعر
    • دالة getFormattedPrice() تُرجع السعر منسقًا بالشكل "$[price]" مع منزلتين عشريتين
  • Stockable.php: أنشئ سمة باسم Stockable تدير المخزون. يجب أن تحتوي السمة على:
    • خاصية $stock خاصة (من النوع integer)
    • دالة setStock(int $quantity) تخزّن كمية المخزون
    • دالة getStock() تُرجع المخزون الحالي
    • دالة isInStock() تُرجع true إذا كان المخزون أكبر من 0، وfalse خلاف ذلك
  • main.php: ضمّن ملفي السمتين وأنشئ صنفًا باسم Product يستخدم سمتي Priceable وStockable. استخدم ترقية المُنشئ لتعريف خاصية عامة باسم $name. يجب أن يقبل المُنشئ أيضًا سعرًا وكمية مخزون، مع استخدام دوال السمتين لتعيينهما.

    ستتلقى ثلاث قيم إدخال: اسم منتج، وسعرًا، وكمية مخزون. أنشئ منتجًا بهذه القيم واطبع أربعة أسطر:

    • اسم المنتج
    • السعر المنسق (باستخدام getFormattedPrice())
    • كمية المخزون
    • "Available" إذا كان المنتج متوفرًا في المخزون، أو "Out of stock" إذا لم يكن كذلك

يوضح هذا كيفية عمل السمات المتعددة معًا. يكتسب صنف Product إمكانات التسعير من سمة، وإدارة المخزون من سمة أخرى، مع إبقاء كل مسؤولية منفصلة بوضوح ودمجها في منتج متكامل الوظائف.

جرّب بنفسك

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: أنشئ صنف Product يستخدم كلاً من سمتي Priceable و Stockable
// استخدم ترقية المُنشئ للخاصية العامة $name
// يجب أن يقبل المُنشئ name و price و stock، ويستخدم طرق السمات لتعيين السعر والمخزون

class Product {
    // TODO: استخدم السمات هنا

    // TODO: نفّذ المُنشئ مع ترقية المُنشئ لـ $name
    // وعيّن السعر والمخزون باستخدام طرق السمات
}

// اقرأ الإدخال
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: أنشئ مثيلاً من Product بقيم الإدخال

// TODO: اطبع اسم المنتج
// TODO: اطبع السعر المنسّق باستخدام getFormattedPrice()
// TODO: اطبع كمية المخزون
// TODO: اطبع "Available" إذا كان متوفراً في المخزون، أو "Out of stock" إذا لم يكن
?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت