Menu
Coddy logo textTech

__clone ושיבוט אובייקטים

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

כשאתה משייך אובייקט אחד למשתנה אחר ב-PHP, אתה לא יוצר עותק — שני המשתנים מצביעים לאותו אובייקט. כדי ליצור עותק עצמאי אמיתי, עליך להשתמש במילת המפתח clone:

<?php
class Product {
    public function __construct(
        public string $name,
        public float $price
    ) {}
}

$original = new Product("Laptop", 999.99);
$copy = clone $original;

$copy->price = 899.99;
echo $original->price . " - " . $copy->price;

פלט:

999.99 - 899.99

כברירת מחדל, PHP מבצעת העתקה שטחית — היא מעתיקה ישירות את כל ערכי המאפיינים. זה עובד היטב עבור ערכים סקלריים, אבל אובייקטים בתוך האובייקט שלך עדיין מפנים לאותו מופע. מתודת הקסם __clone() מאפשרת לך להתאים אישית את ההתנהגות הזאת:

<?php
class Order {
    public function __construct(
        public int $id,
        public array $items = []
    ) {}
    
    public function __clone(): void {
        $this->id = 0;
        $this->items = [];
    }
}

$order1 = new Order(101, ["Book", "Pen"]);
$order2 = clone $order1;

echo "Original: " . $order1->id . ", Clone: " . $order2->id;

פלט:

Original: 101, Clone: 0

המתודה __clone() נקראת על האובייקט החדש לאחר יצירת העתקה שטחית. כאן מאפסים מזהים, יוצרים עותקים חדשים של אובייקטים מקוננים או מבצעים ניקוי שנדרש כדי שהשיבוט יהיה עצמאי באמת.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול גרסאות של מסמכים, שמדגימה כיצד שכפול יוצר עותקים עצמאיים וכיצד מתודת הקסם __clone() מאפשרת להתאים אישית את מה שקורה כאשר אובייקט משוכפל.

תארגנו את הקוד בשני קבצים:

  • Document.php: צרו מחלקה בשם Document שמייצגת מסמך עם גרסאות. השתמשו בקידום מאפיינים בבנאי כדי להגדיר $title ציבורי (מחרוזת), $content ציבורי (מחרוזת) ו-$version ציבורי (מספר שלם, שערכו כברירת מחדל הוא 1). הוסיפו מאפיין $createdAt פרטי ששומר את חותמת הזמן הנוכחית (השתמשו ב-date('Y-m-d H:i:s') בבנאי). המסמך שלכם צריך לכלול:
    • getCreatedAt(): מחזירה את חותמת הזמן של היצירה
    • __clone(): כאשר מסמך משוכפל, יש להגדיל את הגרסה ב-1 ולאפס את $createdAt לחותמת הזמן הנוכחית (השכפול הוא גרסה חדשה שנוצרה ״עכשיו״)
  • main.php: כללו את קובץ המסמך. תקבלו שלוש קלטים: כותרת, תוכן ומחרוזת תוכן חדשה עבור הגרסה המשוכפלת. צרו Document עם הכותרת והתוכן. לאחר מכן שכפלו אותו כדי ליצור גרסה חדשה, ועדכנו את התוכן של השכפול למחרוזת התוכן החדשה. הדפיסו ארבע שורות:
    • הגרסה של המסמך המקורי
    • הגרסה של המסמך המשוכפל
    • התוכן של המסמך המקורי
    • התוכן של המסמך המשוכפל

המערכת הזאת מדגימה כיצד __clone() מאפשרת לכם לשלוט במה שקורה במהלך השכפול. המסמך המקורי שומר על הגרסה ועל זמן היצירה שלו, ואילו השכפול הופך אוטומטית לגרסה חדשה עם חותמת זמן עדכנית — אידיאלי למעקב אחר היסטוריית מסמכים, שבה כל שכפול מייצג מהדורה חדשה.

נסו בעצמכם

<?php

require_once 'Document.php';

// קרא את הקלטים
$title = trim(fgets(STDIN));
$content = trim(fgets(STDIN));
$newContent = trim(fgets(STDIN));

// TODO: צור Document עם הכותרת והתוכן

// TODO: שכפל את המסמך כדי ליצור גרסה חדשה

// TODO: עדכן את תוכן העותק המשוכפל למחרוזת התוכן החדשה

// TODO: הדפס ארבע שורות:
// 1. הגרסה של המסמך המקורי
// 2. הגרסה של המסמך המשוכפל
// 3. התוכן של המסמך המקורי
// 4. התוכן של המסמך המשוכפל

?>
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין