Menu
Coddy logo textTech

__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, ומציעות גישה נקייה יותר שבה עובדים ישירות עם מערכי נתונים במקום עם שמות מאפיינים.

challenge icon

אתגר

קל

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

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

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

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

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