معيار التحميل التلقائي 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. هذه الاتفاقية تجعل التنقل في المشاريع وصيانتها أسهل.
التحدي
سهللنقم ببناء نظام تحميل تلقائي (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: قم بطباعة نتيجة
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)