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