__serialize ו־__unserialize
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 49 מתוך 91.
כשצריך להמיר אובייקט למחרוזת לצורך אחסון או העברה, PHP משתמשת בסריאליזציה. מתודות הקסם __serialize() ו-__unserialize() מאפשרות לך לשלוט בדיוק באילו נתונים יישמרו ובאופן שבו הם ישוחזרו.
המתודה __serialize() מחזירה מערך של נתונים לסריאליזציה, ואילו __unserialize() מקבלת את המערך הזה ובונה מחדש את האובייקט:
<?php
class Session {
public function __construct(
private string $userId,
private array $data,
private int $createdAt
) {}
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}
public function getCreatedAt(): int {
return $this->createdAt;
}
}
$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);
$restored = unserialize($serialized);
echo "Created at: " . $restored->getCreatedAt();
שימו לב ש-createdAt מוחרג מסריאליזציה ומקבל חותמת זמן עדכנית בעת ביטול הסריאליזציה. הדבר שימושי להחרגת נתונים רגישים, ערכים זמניים או משאבים שלא ניתן לבצע להם סריאליזציה, כמו חיבורי מסד נתונים.
השיטות האלה החליפו את השיטות הישנות __sleep() ו-__wakeup() ב-PHP 7.4, ומציעות גישה נקייה יותר שבה עובדים ישירות עם מערכי נתונים במקום עם שמות מאפיינים.
אתגר
קלבואו נבנה מערכת לשמירת פרופילי משתמשים במטמון, שמדגימה איך __serialize() ו-__unserialize() מאפשרות לך לשלוט בנתונים שנשמרים ובאופן השחזור שלהם.
תארגנו את הקוד שלכם בשני קבצים:
UserProfile.php: צרו מחלקה בשםUserProfileשמייצגת פרופיל משתמש וכוללת יכולות שמירה במטמון. השתמשו בקידום מאפיינים בבנאי כדי להגדיר מאפיינים פרטיים עבור$userId(מחרוזת),$username(מחרוזת),$email(מחרוזת) ו-$accessToken(מחרוזת). הוסיפו מאפיין פרטי$cachedAtששומר מתי הפרופיל נשמר במטמון (אתחלו אותו בבנאי לערך"not cached"). המחלקה שלכם צריכה לכלול:__serialize(): מחזירה מערך שמכיל רק אתuserId,usernameו-email.accessTokenהוא רגיש ואסור לסדר אותו לעולם. חותמת הזמןcachedAtתיווצר מחדש בעת השחזור.__unserialize(): משחזרת אתuserId,usernameו-emailממערך הנתונים. מגדירה אתaccessTokenלערך"expired"(מכיוון שאסור לשמור אסימונים).getInfo(): מחזירה מחרוזת בפורמט:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php: כללו את קובץ UserProfile. תקבלו ארבעה קלטים: מזהה משתמש, שם משתמש, כתובת דוא"ל ואסימון גישה. צרו מופע שלUserProfileעם הערכים האלה. הדפיסו שלוש שורות:- המידע של הפרופיל המקורי (לפני הסריאליזציה)
- בצעו סריאליזציה לפרופיל באמצעות
serialize(), ואז בטלו את הסריאליזציה שלו באמצעותunserialize()כדי ליצור פרופיל משוחזר. הדפיסו את המידע של הפרופיל המשוחזר. - הדפיסו
"Token preserved: yes"או"Token preserved: no", בהתאם לשאלה אם האסימון של הפרופיל המשוחזר תואם למקורי (רמז: הוא לא אמור להתאים, כי אסימונים פגים בעת השחזור)
התבנית הזאת חיונית לשמירה בטוחה במטמון של נתוני משתמשים. רוצים לשמור את פרטי הפרופיל, אך לעולם לא לשמור פרטי התחברות רגישים כמו אסימוני גישה. כשהפרופיל משוחזר מהמטמון, האסימון מסומן כפג תוקף, וכך האפליקציה נאלצת להשיג אסימון חדש.
נסו בעצמכם
<?php
require_once 'UserProfile.php';
// קראו את הקלטים
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: צרו מופע של UserProfile עם ערכי הקלט
// TODO: הדפיסו את פרטי הפרופיל המקורי (לפני סריאליזציה)
// TODO: בצעו סריאליזציה לפרופיל, ואז דה־סריאליזציה כדי ליצור פרופיל משוחזר
// TODO: הדפיסו את פרטי הפרופיל המשוחזר
// TODO: הדפיסו "Token preserved: yes" או "Token preserved: no"
// בהתאם לשאלה אם הטוקן של הפרופיל המשוחזר תואם לטוקן של הפרופיל המקורי
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין