Menu
Coddy logo textTech

מבוא למרחבי שמות

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

ככל שפרויקטי ה-PHP שלך גדלים, תיצור מחלקות רבות. מה קורה כשיש לשתי מחלקות אותו שם?

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

מרחב שמות הוא כמו תיקייה עבור המחלקות שלך. מכריזים עליו בראש קובץ ה-PHP באמצעות מילת המפתח namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

עכשיו אפשר שתהיה לך מחלקת User נוספת במרחב שמות אחר:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

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

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

פלט:

Alice
alice@example.com

לוכסן הפוך \ מפריד בין רמות של מרחבי שמות, בדומה לאופן שבו לוכסנים מפרידים בין תיקיות בנתיב קובץ. אפשר גם ליצור מרחבי שמות מקוננים כמו App\Models\Blog לארגון מעמיק יותר.

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

challenge icon

אתגר

קל

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

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

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

  • Vehicle/Car.php: הגדירו מחלקת Car במרחב השמות Vehicle עם מאפיין public $brand. הבנאי צריך לקבל את שם המותג ולהגדיר אותו. הוסיפו מתודה describe() שמחזירה "Vehicle: [brand]".
  • Animal/Car.php: הגדירו מחלקת Car במרחב השמות Animal (זהו חתול בשם Car!). צריך להיות לה מאפיין public $age. הבנאי מקבל את הגיל ומגדיר אותו. הוסיפו מתודה describe() שמחזירה "Cat named Car, age: [age]".
  • main.php: כללו את שני קובצי המחלקות באמצעות require_once. צרו אובייקט אחד מכל מרחב שמות באמצעות הנתיבים המלאים של מרחבי השמות שלהם, ואז הדפיסו את התוצאה של קריאה ל־describe() בכל אחד מהאובייקטים (כל אחד בשורה משלו).

ב־main.php, צרו:

  • Vehicle\Car עם המותג "Toyota"
  • Animal\Car עם גיל 3

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

נסו בעצמכם

<?php
// כלול את קובצי המחלקות
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';

// TODO: צור אובייקט מסוג Vehicle\Car עם המותג "Toyota"
// זכור להשתמש בנתיב המלא של מרחב השמות עם לוכסן הפוך

// TODO: צור אובייקט מסוג Animal\Car בגיל 3
// זכור להשתמש בנתיב המלא של מרחב השמות עם לוכסן הפוך

// TODO: הדפס את התוצאה של describe() עבור כל אובייקט (כל אחד בשורה נפרדת)

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

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

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

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