Menu
Coddy logo textTech

מאפיינים לקריאה בלבד (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 אונליין