أداة التحميل التلقائي Composer
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 13 من 91.
إن كتابة أداة التحميل التلقائي (autoloader) الخاصة بك تعمل، ولكن مشاريع PHP الحقيقية تستخدم Composer للتعامل مع التحميل التلقائي بشكل آلي. يقرأ Composer إعدادات مشروعك ويقوم بإنشاء أداة تحميل تلقائي محسنة تتبع معايير PSR-4.
يوجد التكوين في ملف composer.json في المجلد الرئيسي لمشروعك. إليك كيفية تحديد قواعد التحميل التلقائي (autoloading):
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}يخبر هذا Composer أن أي فئة تبدأ بـ App\ يجب تحميلها من المجلد src/. بعد إعداد ذلك، يقوم Composer بإنشاء ملفات التحميل التلقائي (autoloader) في مجلد vendor/.
لاستخدام أداة التحميل التلقائي (autoloader) الخاصة بـ Composer، تحتاج فقط إلى سطر واحد في الجزء العلوي من ملف الإدخال الخاص بك:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
تتعامل عبارة require الواحدة هذه مع كافة عمليات تحميل الفئات (class loading) لمشروعك بالكامل. يمكنك تحديد خرائط مساحات أسماء (namespace mappings) متعددة إذا لزم الأمر:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}نقطة رئيسية: يلغي محمل Composer التلقائي الحاجة إلى تضمين الملفات يدوياً ويضمن تحميلاً متسقاً للفئات عبر مشروعك. إنه النهج القياسي المستخدم من قبل جميع تطبيقات وأطر عمل PHP الحديثة تقريباً.
التحدي
سهللنقم ببناء تطبيق صغير يستخدم نهج التحميل التلقائي (autoloading) الخاص بـ Composer لتنظيم الفئات عبر ملفات متعددة. ستقوم بمحاكاة كيفية هيكلة مشروع PHP حقيقي لكوده باستخدام مساحات الأسماء PSR-4 ومحمل تلقائي مركزي.
ستقوم بإنشاء أربعة ملفات تعمل معاً:
src/Models/Product.php— قم بتعريف فئةProductفي مساحة الاسمApp\Models. يجب أن تحتوي على خصائصpublic $nameوpublic $price، ومنشئ (constructor) يقبل ويضبط كلتا القيمتين، وتابعgetInfo()يعيد"[name]: $[price]".src/Models/Customer.php— قم بتعريف فئةCustomerفي مساحة الاسمApp\Models. يجب أن تحتوي على خاصيةpublic $name، ومنشئ يقبل ويضبط الاسم، وتابعgreet()يعيد"Welcome, [name]!".vendor/autoload.php— أنشئ محملاً تلقائياً بسيطاً باستخدامspl_autoload_registerيحاكي سلوك Composer. يجب أن يربط بادئة مساحة الاسمApp\بمجلدsrc/، مع تحويل فواصل مساحة الاسم إلى فواصل مجلدات وإضافة.phpلتحميل الملف الصحيح.index.php— هذا هو ملف نقطة الدخول الخاص بك. اطلب المحمل التلقائي منvendor/autoload.phpبسطر واحد، ثم استخدم الكلمة المفتاحيةuseلاستيراد كل منApp\Models\ProductوApp\Models\Customer. أنشئ كائناً منProductباسم"Laptop"وسعر999، وكائناً منCustomerباسم"Alice". اطبع نتيجة استدعاءgreet()على العميل وgetInfo()على المنتج (كل منهما في سطر منفصل).
المفهوم الأساسي هنا هو أن ملف index.php الخاص بك يحتاج فقط إلى عبارة require واحدة لتحميل المحمل التلقائي — بعد ذلك، يتم تحميل جميع الفئات تلقائياً عند استخدامها. هذه هي بالضبط الطريقة التي تعمل بها أطر عمل وتطبيقات PHP الحديثة مع Composer.
ورقة مرجعية
يقوم Composer بأتمتة تحميل الفئات (class loading) من خلال قراءة ملف تكوين composer.json وإنشاء محمل تلقائي (autoloader) محسّن يتبع معايير PSR-4.
قم بتعريف قواعد التحميل التلقائي في composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}يقوم هذا بربط مساحة الاسم (namespace) App\ بمجلد src/. يقوم Composer بإنشاء ملفات المحمل التلقائي في مجلد vendor/.
استخدم المحمل التلقائي الخاص بـ Composer باستخدام عبارة require واحدة:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
قم بتعريف تعيينات متعددة لمساحات الأسماء إذا لزم الأمر:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}يغني المحمل التلقائي لـ Composer عن تضمين الملفات يدوياً وهو النهج القياسي في تطبيقات PHP الحديثة.
جرّب بنفسك
<?php
// TODO: استدعاء المحمل التلقائي (autoloader) من vendor/autoload.php
// TODO: استخدم الكلمة المفتاحية 'use' لاستيراد App\Models\Product
// TODO: استخدم الكلمة المفتاحية 'use' لاستيراد App\Models\Customer
// TODO: إنشاء منتج (Product) باسم "Laptop" وسعر 999
// TODO: إنشاء عميل (Customer) باسم "Alice"
// TODO: طباعة نتيجة الدالة greet() الخاصة بالعميل
// TODO: طباعة نتيجة الدالة getInfo() الخاصة بالمنتج
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)