Menu
CoddyTech

מאפיינים לקריאה בלבד (PHP 8.1)

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

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

מכריזים על מאפיין לקריאה בלבד על ידי הוספת מילת המפתח readonly לפני הצהרת הטיפוס:

<?php
class User {
    public readonly string $id;
    public readonly string $name;
    
    public function __construct(string $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;

פלט:

U001
Alice

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

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

<?php
class Product {
    public function __construct(
        public readonly string $sku,
        private readonly float $cost
    ) {}
    
    public function getCost(): float {
        return $this->cost;
    }
}

$product = new Product("ABC123", 29.99);
echo $product->sku;

פלט:

ABC123

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

challenge icon

אתגר

קל

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

תיצרו שני קבצים שישתפו פעולה לניהול תצורת היישום:

  • Config.php: הגדירו מחלקה בשם Config שמייצגת את תצורת היישום באמצעות הגדרות בלתי־ניתנות לשינוי. למחלקה צריכים להיות שלושה מאפייני readonly ציבוריים: string $appName, string $version ו-int $maxConnections. השתמשו בקידום מאפיינים בבנאי כדי להצהיר על שלושת מאפייני ה-readonly ולאתחל אותם בהגדרת בנאי יחידה ותמציתית. הוסיפו מתודה בשם getInfo() שמחזירה מחרוזת בתבנית "[appName] v[version] (max: [maxConnections] connections)".
  • main.php: כללו את קובץ המחלקה Config. יתקבלו שלושה קלטים: שם היישום, הגרסה ומספר החיבורים המרבי (כמחרוזת שצריך להמיר למספר שלם). צרו אובייקט מסוג Config באמצעות הערכים האלה. הדפיסו בשורה הראשונה את התוצאה של getInfo(). לאחר מכן, הדפיסו כל מאפיין readonly בשורה נפרדת על ידי גישה ישירה אליו: שם היישום, הגרסה ומספר החיבורים המרבי.

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

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

נסו בעצמכם

<?php

require_once 'Config.php';

// קרא את ערכי הקלט
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));

// TODO: צור אובייקט Config באמצעות ערכי הקלט

// TODO: הדפס את התוצאה של getInfo()

// TODO: הדפס כל מאפיין readonly בשורה נפרדת:
// - שם היישום
// - גרסה
// - מספר החיבורים המרבי

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

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

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

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