מתודות גישה ועדכון
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 40 מתוך 91.
כעת, לאחר שהבנת את מגבילי הגישה, איך אפשר לעבוד בבטחה עם מאפיינים פרטיים מחוץ למחלקה? התשובה היא פעולות getter ו-setter — מתודות ציבוריות שמאפשרות גישה מבוקרת לנתונים פרטיים.
getter שולף את הערך של מאפיין, ואילו setter משנה אותו. התבנית הזו מאפשרת לך להוסיף אימות או לוגיקה כשניגשים לנתונים או משנים אותם:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
פלט:
john@example.com
25ה-setter מאמת את פורמט כתובת האימייל ומוודא שהגיל סביר לפני שמירת הערכים. ללא setters, כל אחד יכול היה להקצות נתונים לא תקינים ישירות. אפשר גם ליצור מאפיינים לקריאה בלבד באמצעות getter בלבד, או מאפיינים לכתיבה בלבד באמצעות setter בלבד.
נקודה מרכזית: פונקציות getter ו-setter נותנות לך שליטה על אופן הגישה לנתונים פרטיים ועל אופן השינוי שלהם, ומאפשרות לבצע אימות, עיצוב או כל לוגיקה מותאמת אישית.
אתגר
קלבואו נבנה מערכת לניהול מלאי מוצרים שמשתמשת במתודות getter ו-setter כדי להגן על נתוני המוצר ולאמת אותם. תיצרו מחלקה Product שמבטיחה שהמחירים תמיד חיוביים ושכמויות המלאי לעולם אינן שליליות: כך תראו כיצד מתודות setter יכולות לאכוף כללים עסקיים.
תארגנו את הקוד בשני קבצים:
Product.php: צרו מחלקהProductעם שלוש תכונות פרטיות:$name(מחרוזת),$price(מספר עשרוני) ו-$stock(מספר שלם). ממשו מתודות getter ו-setter לכל תכונה, עם כללי האימות הבאים:setName()צריכה לקבל רק מחרוזות שאינן ריקות; אם המחרוזת ריקה לאחר הסרת הרווחים, אל תעדכנו את התכונהsetPrice()צריכה לקבל רק ערכים שגדולים מ-0: דחו מחירים אפסיים או שלילייםsetStock()צריכה לקבל רק ערכים של 0 או יותר: דחו כמויות מלאי שליליות
getInfo()שמחזירה"[name]: $[price] ([stock] in stock)", כשהמחיר מעוצב עם 2 ספרות אחרי הנקודה העשרונית.main.php: כללו את קובץ Product. תקבלו ארבעה קלטים: שם מוצר, מחיר, כמות במלאי ומחיר חדש לעדכון. צרו מופע שלProductוהשתמשו במתודות setter כדי להגדיר את השם, המחיר ההתחלתי (לאחר המרה למספר עשרוני) והמלאי (לאחר המרה למספר שלם). הדפיסו את התוצאה שלgetInfo(). לאחר מכן נסו לעדכן את המחיר באמצעות ערך המחיר החדש (לאחר המרה למספר עשרוני) והדפיסו שוב אתgetInfo(). לבסוף, נסו להגדיר את המלאי ל--5(ערך לא תקין) והדפיסו אתgetInfo()פעם נוספת כדי לוודא שהמלאי לא השתנה.
מתודות ה-setter שלכם משמשות כשומרות סף. הן מאמתות את הנתונים הנכנסים לפני שהן מאפשרות לבצע שינויים בתכונות הפרטיות. כאשר מועברים נתונים לא תקינים (כמו מלאי שלילי), מתודת ה-setter פשוט מתעלמת מהם ומשאירה את הערך התקין הקיים ללא שינוי. זהו כוחה של הכמסה: האובייקט שלכם שומר על שלמותו, בלי קשר למה שהקוד החיצוני מנסה לעשות.
נסו בעצמכם
<?php
require_once 'Product.php';
// קראו את נתוני הקלט
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: צרו מופע חדש של Product
// TODO: השתמשו בפונקציות setter כדי להגדיר שם, מחיר (כ-float) ומלאי (כ-integer) התחלתיים
// TODO: הדפיסו את התוצאה של getInfo()
// TODO: עדכנו את המחיר באמצעות newPrice (כ-float) והדפיסו שוב את getInfo()
// TODO: נסו להגדיר את המלאי ל--5 (ערך לא תקין) והדפיסו את getInfo() כדי לוודא שהמלאי לא השתנה
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין