Menu
Coddy logo textTech

__get, __set, __isset, __unset

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 46 מתוך 91.

PHP מספקת ארבע מתודות קסם שמיירטות גישה למאפיינים: __get(), __set(), __isset() ו-__unset(). הן מופעלות כשמנסים לגשת למאפיינים שאינם קיימים או שאי אפשר לגשת אליהם.

המתודה __get() נקראת בעת קריאה של מאפיין שאינו נגיש, ואילו __set() מטפלת בכתיבה אליו. כך אפשר ליצור מאפיינים דינמיים או להוסיף לוגיקה בעת גישה למאפיינים:

<?php
class DynamicObject {
    private array $data = [];
    
    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;

פלט:

Hello - 42

המתודה __isset() מופעלת על ידי isset() או empty(), ו־__unset() מגיבה לפונקציה unset():

<?php
class DynamicObject {
    private array $data = [];
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
    
    public function __isset(string $name): bool {
        return isset($this->data[$name]);
    }
    
    public function __unset(string $name): void {
        unset($this->data[$name]);
    }
}

$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";

פלט:

exists

בדרך כלל משתמשים בשיטות האלה כדי ליצור מכלי נתונים גמישים, לממש טעינה עצלה או לבנות אובייקטים שמתנהגים כמו מערכים תוך שמירה על מבנה מונחה־עצמים.

challenge icon

אתגר

קל

בואו נבנה מנהל הגדרות גמיש ששומר הגדרות באופן דינמי באמצעות שיטות קסם. המחלקה שלך תיירט גישה למאפיינים כדי לנהל ערכי תצורה, לבדוק אם הגדרות קיימות ולהסיר אותן בעת הצורך — וכל זאת בלי להגדיר במפורש כל מאפיין.

תארגן את הקוד שלך בשני קבצים:

  • Config.php: צור מחלקת Config שמשתמשת במערך פרטי כדי לאחסן ערכי תצורה באופן פנימי. ממש את כל ארבע שיטות הקסם למאפיינים:
    • __get($name): מחזירה את הערך של המפתח הנתון, או "undefined" אם המפתח אינו קיים
    • __set($name, $value): שומרת את הערך תחת המפתח הנתון
    • __isset($name): מחזירה אם המפתח קיים בתצורה
    • __unset($name): מסירה את המפתח מהתצורה
    הוסף גם שיטה count() שמחזירה את מספר ההגדרות המאוחסנות.
  • main.php: כלול את קובץ Config. תקבל שלוש קלטים: שם של הגדרה, ערך של הגדרה ושם של הגדרה שנייה. צור מופע של Config ובצע את הפעולות האלה:
    • הגדר את ההגדרה הראשונה לערך הנתון
    • הדפס אם ההגדרה הראשונה קיימת באמצעות isset(): הפלט יהיה "exists" או "missing"
    • הדפס את הערך של ההגדרה הראשונה
    • הדפס את המספר הנוכחי של ההגדרות
    • השתמש ב-unset() כדי להסיר את ההגדרה הראשונה
    • הדפס אם ההגדרה הראשונה קיימת כעת: הפלט יהיה "exists" או "missing"
    • הדפס את הערך של ההגדרה השנייה (שמעולם לא הוגדרה)

כל פלט צריך להופיע בשורה נפרדת. שיטות הקסם מאפשרות לך לעבוד עם אובייקט Config שלך באמצעות תחביר טבעי של מאפיינים, כמו $config->theme = "dark" ו-isset($config->theme), אף שלא מוגדרים מאפיינים ממשיים.

נסו בעצמכם

<?php

require_once 'Config.php';

// קריאת קלטים
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: ליצור מופע של Config

// TODO: להגדיר את ההגדרה הראשונה לערך הנתון

// TODO: להדפיס אם ההגדרה הראשונה קיימת ("exists" או "missing")

// TODO: להדפיס את הערך של ההגדרה הראשונה

// TODO: להדפיס את מספר ההגדרות הנוכחי

// TODO: להשתמש ב-unset() כדי להסיר את ההגדרה הראשונה

// TODO: להדפיס אם ההגדרה הראשונה קיימת כעת ("exists" או "missing")

// TODO: להדפיס את הערך של ההגדרה השנייה (שמעולם לא הוגדרה)

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

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

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

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