Menu
CoddyTech

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