Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

معيار التحميل التلقائي PSR-4

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 12 من 91.

PSR-4 هو معيار يحدد كيفية تحميل فئات PHP تلقائياً بناءً على مساحة الاسم (namespace) وموقع الملف الخاص بها. بدلاً من تضمين كل ملف فئة يدوياً، يتيح PSR-4 لـ PHP العثور على الفئات وتحميلها تلقائياً عند استخدامها.

القاعدة الأساسية بسيطة: يجب أن يتطابق مساحة الاسم (namespace) مع هيكل المجلدات. إذا كان لديك فئة (class) 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;
    }
}

يمكنك كتابة دالة تحميل تلقائي (autoloader) بسيطة تتبع قواعد 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 باستدعاء دالتك كلما واجهت فئة (class) غير معروفة. تقوم الدالة بتحويل الـ namespace إلى مسار ملف وتحميله.

نقطة رئيسية: ينشئ PSR-4 تعييناً يمكن التنبؤ به بين مساحات الأسماء (namespaces) ومسارات الملفات. عندما ترى App\Models\User، ستعرف على الفور أن الملف موجود في src/Models/User.php. هذه الاتفاقية تجعل التنقل في المشاريع وصيانتها أسهل.

challenge icon

التحدي

سهل

لنقم ببناء نظام تحميل تلقائي (autoloading) بسيط بمعيار PSR-4 يقوم بتحميل الفئات (classes) تلقائياً بناءً على مساحة الاسم (namespace) وموقع الملف الخاص بها.

ستقوم بإنشاء مشروع يتكون من ثلاثة ملفات توضح كيف يقوم PSR-4 بربط مساحات الأسماء بمسارات المجلدات:

  • src/Services/Logger.php — قم بتعريف فئة Logger داخل مساحة الاسم App\Services. يجب أن تحتوي على خاصية public $name، ومنشئ (constructor) يقبل الاسم ويقوم بتعيينه، وتابع log($message) يعيد "[name] logged: [message]".
  • src/Services/Mailer.php — قم بتعريف فئة Mailer داخل مساحة الاسم App\Services. يجب أن تحتوي على خاصية public $sender، ومنشئ يقبل المرسل ويقوم بتعيينه، وتابع send($to) يعيد "Mail from [sender] to [to]".
  • main.php — أنشئ محملًا تلقائيًا (autoloader) بمعيار PSR-4 باستخدام spl_autoload_register يقوم بربط بادئة مساحة الاسم App\ بمجلد src/. يجب أن يقوم المحمل التلقائي بتحويل فواصل مساحة الاسم إلى فواصل مجلدات وإضافة .php للعثور على الملف الصحيح. بعد تسجيل المحمل التلقائي، استخدم الكلمة المفتاحية use لاستيراد كلتا الفئتين، ثم أنشئ كائن Logger بالاسم "FileLogger" وكائن Mailer بالمرسل "admin@site.com". اطبع نتيجة استدعاء log("System started") على المسجل (logger) و send("user@example.com") على المرسل (mailer) (كل منهما في سطر مستقل).

الفكرة الأساسية هي أن دالة المحمل التلقائي الخاصة بك تستقبل اسم الفئة المؤهل بالكامل (مثل App\Services\Logger) ويجب أن تحوله إلى مسار ملف (src/Services/Logger.php). استخدم strpos للتحقق مما إذا كانت الفئة تبدأ ببادئة مساحة الاسم الخاصة بك، و substr للحصول على اسم الفئة النسبي، و str_replace لتحويل الشرطات المائلة الخلفية (backslashes) إلى شرطات مائلة أمامية (forward slashes).

ورقة مرجعية

PSR-4 هو معيار يحدد كيفية تحميل فئات PHP تلقائياً بناءً على مساحة الاسم (namespace) وموقع الملف. يجب أن تتطابق مساحة الاسم مع هيكل المجلدات.

مثال على هيكل الفئة:

<?php
// File: src/Models/User.php
namespace App\Models;

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

محمل تلقائي (autoloader) بمعيار PSR-4 باستخدام spl_autoload_register:

<?php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Check if class uses our namespace prefix
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

يقوم المحمل التلقائي بتحويل فواصل مساحة الاسم (\) إلى فواصل المجلدات (/) ويضيف .php للعثور على الملف الصحيح. على سبيل المثال، App\Models\User يتم توجيهها إلى src/Models/User.php.

جرّب بنفسك

<?php
// PSR-4 تنفيذ المحمل التلقائي

// TODO: spl_autoload_register قم بتسجيل محمل تلقائي باستخدام
// يجب على المحمل التلقائي:
// 'App\' التحقق مما إذا كانت الفئة تبدأ ببادئة مساحة الاسم .1
// للحصول على اسم الفئة النسبي 'App\' إزالة بادئة .2
// (/) إلى فواصل الأدلة (\) تحويل فواصل مساحة الاسم .3
// لبناء مسار الملف '.php' وإلحاق 'src/' إضافة .4
// طلب الملف إذا كان موجوداً .5

spl_autoload_register(function ($class) {
    // TODO: قم بتعريف بادئة مساحة الاسم والدليل الأساسي
    
    // (strpos استخدم) TODO: تحقق مما إذا كانت الفئة تستخدم بادئة مساحة الاسم
    
    // (substr استخدم) TODO: احصل على اسم الفئة النسبي
    
    // (str_replace استخدم) / بـ \ TODO: قم ببناء مسار الملف عن طريق استبدال
    
    // TODO: قم بطلب الملف إذا كان موجوداً
});

// Mailer و Logger لاستيراد فئتي 'use' TODO: استخدم الكلمة المفتاحية

// "FileLogger" باسم Logger TODO: قم بإنشاء مثيل من

// "admin@site.com" بمرسل Mailer TODO: قم بإنشاء مثيل من

// log("System started") TODO: قم بطباعة نتيجة

// send("user@example.com") TODO: قم بطباعة نتيجة
?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming