Menu
Coddy logo textTech

שימוש במספר טרייטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 52 מתוך 91.

תכונה יחידה שימושית, אבל העוצמה האמיתית מתגלה כשמשלבים כמה תכונות במחלקה אחת. PHP מאפשרת לך לכלול כמה תכונות שצריך, וכך להעניק למחלקה שלך יכולות מכמה מקורות בבת אחת.

כדי להשתמש בכמה traits, פשוט רשמו אותם מופרדים בפסיקים אחרי מילת המפתח 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 מטפלת במזהים ייחודיים. הגישה הזאת משאירה כל תכונה ממוקדת באחריות אחת, והופכת את הקוד שלך למודולרי יותר וניתן לשימוש חוזר.

מה קורה כשלשתי תכונות יש מתודות באותו שם? זהו מצב של התנגשות שנחקור בשיעור הבא.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מוצרים שמשלבת כמה traits כדי להעניק למוצרים יכולות תמחור וניהול מלאי. כל trait יטפל באחריות אחת, והמחלקה של המוצר שלך תקבל פונקציונליות משניהם.

תארגן את הקוד שלך בשלושה קבצים:

  • Priceable.php: צור trait בשם Priceable שמטפל בפונקציונליות התמחור. ל-trait צריכים להיות:
    • מאפיין פרטי $price (מספר ממשי)
    • מתודה setPrice(float $price) ששומרת את המחיר
    • מתודה getPrice() שמחזירה את המחיר
    • מתודה getFormattedPrice() שמחזירה את המחיר בפורמט "$[price]" עם 2 ספרות אחרי הנקודה העשרונית
  • Stockable.php: צור trait בשם Stockable שמנהל את המלאי. ל-trait צריכים להיות:
    • מאפיין פרטי $stock (מספר שלם)
    • מתודה setStock(int $quantity) ששומרת את כמות המלאי
    • מתודה getStock() שמחזירה את המלאי הנוכחי
    • מתודה isInStock() שמחזירה true אם המלאי גדול מ-0, ו-false אחרת
  • main.php: כלול את שני קובצי ה-trait וצור מחלקה בשם Product שמשתמשת בשני ה-traits, Priceable ו-Stockable. השתמש בקידום מאפיינים בבנאי כדי להגדיר מאפיין ציבורי $name. הבנאי צריך לקבל גם מחיר וכמות מלאי, ולהשתמש במתודות של ה-traits כדי להגדיר אותם.

    תקבל שלוש קלטים: שם מוצר, מחיר וכמות מלאי. צור מוצר עם הערכים האלה והדפס ארבע שורות:

    • שם המוצר
    • המחיר בפורמט המתאים (באמצעות getFormattedPrice())
    • כמות המלאי
    • "Available" אם המוצר במלאי, או "Out of stock" אם לא

כך אפשר לראות איך כמה traits פועלים יחד. מחלקת Product מקבלת יכולות תמחור מ-trait אחד וניהול מלאי מאחר, וכך כל תחום אחריות נשאר מופרד היטב, ובו בזמן הם משתלבים יחד למוצר בעל יכולות מלאות.

נסו בעצמכם

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

// TODO: צרו מחלקה Product שמשתמשת גם ב-trait ‏Priceable וגם ב-trait ‏Stockable
// השתמשו בקידום פרמטרים בבנאי עבור המאפיין הציבורי $name
// הבנאי צריך לקבל שם, מחיר וכמות במלאי, ולהשתמש במתודות של ה-traits כדי להגדיר את המחיר ואת הכמות במלאי

class Product {
    // TODO: השתמשו כאן ב-traits

    // TODO: מימשו בנאי עם קידום פרמטרים עבור $name
    // והגדירו את המחיר ואת הכמות במלאי באמצעות מתודות של ה-traits
}

// קראו קלט
$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 אונליין