תקן הטעינה האוטומטית PSR-4
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 12 מתוך 91.
PSR-4 הוא תקן שמגדיר כיצד יש לטעון מחלקות PHP באופן אוטומטי על סמך מרחב השמות והמיקום שלהן בקובץ. במקום לכלול ידנית כל קובץ מחלקה, PSR-4 מאפשר ל-PHP למצוא ולטעון מחלקות באופן אוטומטי כשמשתמשים בהן.
הכלל הבסיסי פשוט: מרחב השמות חייב להתאים למבנה הספריות. אם יש לך מחלקה App\Models\User, הקובץ צריך להיות ממוקם בכתובת App/Models/User.php.
<?php
// קובץ: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
אפשר לכתוב פונקציית טעינה אוטומטית פשוטה שפועלת לפי כללי PSR-4:
<?php
// קובץ: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// בדוק אם המחלקה משתמשת בקידומת מרחב השמות שלנו
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
הפונקציה spl_autoload_register אומרת ל-PHP לקרוא לפונקציה שלך בכל פעם שהוא נתקל במחלקה לא מוכרת. הפונקציה ממירה את מרחב השמות לנתיב קובץ וטוענת אותו.
נקודה מרכזית: PSR-4 יוצר מיפוי צפוי בין מרחבי שמות לנתיבי קבצים. כשאתם רואים App\Models\User, אתם יודעים מיד שהקובץ נמצא ב-src/Models/User.php. המוסכמה הזו מקלה על הניווט בפרויקטים ועל תחזוקתם.
אתגר
קלבוא נבנה מערכת פשוטה לטעינה אוטומטית לפי PSR-4, שטוענת מחלקות באופן אוטומטי על סמך מרחב השמות שלהן ומיקום הקובץ שלהן.
תיצור פרויקט עם שלושה קבצים שמדגימים כיצד PSR-4 ממפה מרחבי שמות לנתיבי ספריות:
src/Services/Logger.php: הגדר מחלקה בשםLoggerבמרחב השמותApp\Services. צריכה להיות לה תכונהpublic $name, בנאי שמקבל את השם ומגדיר אותו, ומתודהlog($message)שמחזירה"[name] logged: [message]".src/Services/Mailer.php: הגדר מחלקה בשםMailerבמרחב השמותApp\Services. צריכה להיות לה תכונהpublic $sender, בנאי שמקבל את השולח ומגדיר אותו, ומתודהsend($to)שמחזירה"Mail from [sender] to [to]".main.php: צור טוען אוטומטי לפי PSR-4 באמצעותspl_autoload_register, שממפה את הקידומת של מרחב השמותApp\לספרייהsrc/. על הטוען האוטומטי להמיר מפרידי מרחב שמות למפרידי ספריות ולהוסיף.phpכדי למצוא את הקובץ המתאים. לאחר רישום הטוען האוטומטי, השתמש במילת המפתחuseכדי לייבא את שתי המחלקות, ואז צורLoggerעם השם"FileLogger"ו-Mailerעם השולח"admin@site.com". הדפס את התוצאה של קריאה ל-log("System started")על המתעד ול-send("user@example.com")על רכיב שליחת הדואר (כל אחד בשורה נפרדת).
התובנה המרכזית היא שפונקציית הטוען האוטומטי מקבלת את שם המחלקה המלא, כולל מרחב השמות (למשל App\Services\Logger), וחייבת להמיר אותו לנתיב קובץ (src/Services/Logger.php). השתמש ב-strpos כדי לבדוק אם המחלקה מתחילה בקידומת מרחב השמות שלך, ב-substr כדי לקבל את שם המחלקה היחסי, וב-str_replace כדי להמיר קווים נטויים הפוכים לקווים נטויים.
נסו בעצמכם
<?php
// מימוש טוען אוטומטי לפי PSR-4
// TODO: רשום טוען אוטומטי באמצעות spl_autoload_register
// הטוען האוטומטי צריך:
// 1. לבדוק אם המחלקה מתחילה בקידומת מרחב השמות 'App\'
// 2. להסיר את הקידומת 'App\' כדי לקבל את שם המחלקה היחסי
// 3. להמיר מפרידי מרחב שמות (\) למפרידי תיקיות (/)
// 4. להוסיף את 'src/' בתחילת הנתיב ואת '.php' בסופו כדי לבנות את נתיב הקובץ
// 5. לטעון את הקובץ אם הוא קיים
spl_autoload_register(function ($class) {
// TODO: הגדר את קידומת מרחב השמות ואת תיקיית הבסיס
// TODO: בדוק אם המחלקה משתמשת בקידומת מרחב השמות (השתמש ב־strpos)
// TODO: קבל את שם המחלקה היחסי (השתמש ב־substr)
// TODO: בנה את נתיב הקובץ על ידי החלפת \ ב־/ (השתמש ב־str_replace)
// TODO: טען את הקובץ אם הוא קיים
});
// TODO: השתמש במילת המפתח 'use' כדי לייבא את המחלקות Logger ו-Mailer
// TODO: צור מופע של Logger עם השם "FileLogger"
// TODO: צור מופע של Mailer עם השולח "admin@site.com"
// TODO: הדפס את התוצאה של log("System started")
// TODO: הדפס את התוצאה של send("user@example.com")
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין