__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בדרך כלל משתמשים בשיטות האלה כדי ליצור מכלי נתונים גמישים, לממש טעינה עצלה או לבנות אובייקטים שמתנהגים כמו מערכים תוך שמירה על מבנה מונחה־עצמים.
אתגר
קלבואו נבנה מנהל הגדרות גמיש ששומר הגדרות באופן דינמי באמצעות שיטות קסם. המחלקה שלך תיירט גישה למאפיינים כדי לנהל ערכי תצורה, לבדוק אם הגדרות קיימות ולהסיר אותן בעת הצורך — וכל זאת בלי להגדיר במפורש כל מאפיין.
תארגן את הקוד שלך בשני קבצים:
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: להדפיס את הערך של ההגדרה השנייה (שמעולם לא הוגדרה)
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין