Menu
Coddy logo textTech

מתודות גישה ועדכון

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

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מלאי מוצרים שמשתמשת במתודות getter ו-setter כדי להגן על נתוני המוצר ולאמת אותם. תיצרו מחלקה Product שמבטיחה שהמחירים תמיד חיוביים ושכמויות המלאי לעולם אינן שליליות: כך תראו כיצד מתודות setter יכולות לאכוף כללים עסקיים.

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

  • Product.php: צרו מחלקה Product עם שלוש תכונות פרטיות: $name (מחרוזת), $price (מספר עשרוני) ו-$stock (מספר שלם). ממשו מתודות getter ו-setter לכל תכונה, עם כללי האימות הבאים:
    • setName() צריכה לקבל רק מחרוזות שאינן ריקות; אם המחרוזת ריקה לאחר הסרת הרווחים, אל תעדכנו את התכונה
    • setPrice() צריכה לקבל רק ערכים שגדולים מ-0: דחו מחירים אפסיים או שליליים
    • setStock() צריכה לקבל רק ערכים של 0 או יותר: דחו כמויות מלאי שליליות
    כל מתודת getter צריכה פשוט להחזיר את ערך התכונה המתאימה. הוסיפו מתודה ציבורית 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() כדי לוודא שהמלאי לא השתנה

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

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

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

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