__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() נקראת על האובייקט החדש לאחר יצירת העתקה שטחית. כאן מאפסים מזהים, יוצרים עותקים חדשים של אובייקטים מקוננים או מבצעים ניקוי שנדרש כדי שהשיבוט יהיה עצמאי באמת.
אתגר
קלבואו נבנה מערכת לניהול גרסאות של מסמכים, שמדגימה כיצד שכפול יוצר עותקים עצמאיים וכיצד מתודת הקסם __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. התוכן של המסמך המשוכפל
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין