Menu
Coddy logo textTech

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

challenge icon

אתגר

קל

בוא נבנה מערכת פשוטה לטעינה אוטומטית לפי 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")
?>
quiz iconבחנו את עצמכם

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

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

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