__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]"
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 אונליין