3.3 · فضاءات الأسماء (namespaces)، التحميل التلقائي (autoloading) وملحن (Composer)

المستوى 3 · قواعد البيانات والبرمجة كائنية التوجه (Databases & OOP)

3.3فضاءات الأسماء (namespaces)، التحميل التلقائي (autoloading) وملحن (Composer)

الهدف: تنظيم مشروع حديث (فضاءات أسماء دون تعارض، وتحميل تلقائي) واستغلال المنظومة عبر ملحن (Composer) (تثبيت مكتبات) — أساس PHP الاحترافية والأطر.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • فضاءات الأسماء تمنع التصادم : namespace App\Modèles; في الرأس، وuse للاستيراد — يتعايش User اثنان في فضاءين مختلفين.
  • التحميل التلقائي يحذف التضمينات : اتفاقية PSR-4 (فضاء الأسماء ← مجلدات/ملفات)، والصنف يُحمَّل عند أول استعمال له.
  • ملحن (Composer) يصل بالمنظومة : composer.json يعلن، وcomposer install ينزل في vendor/ (غير منظَّم) + محمل تلقائي، وcomposer.lock يثبت.

حالة مصغرة متسلسلة — رياد يخرج من جحيم require

رياد، مطور وب في قسنطينة، يصارع أربعين require يدويا وتصادما بين صنف بريده وصنف مكتبة إرسال. رتب أصنافه في فضاءات أسماء App\Boutique، واعتمد التحميل التلقائي PSR-4 (فضاء الأسماء = مسار الملف)، وهيأ ملحن (Composer)، وثبت المكتبة عبر composer require ولم يعد يحمل سوى require واحد 'vendor/autoload.php'. انتهت التضمينات، وانتهت التصادمات.

هذه الحالة نفسها تعود في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة.

1. فضاءات الأسماء والتحميل التلقائي PSR-4

حين يكبر المشروع، مشكلتان : تعارض الأسماء (صنفا User اثنان) والتضمينات اليدوية التي لا تُدار. تنظم فضاءات الأسماء (namespaces) الأصناف في فضاءات منطقية، كالمجلدات : App\Modèles\User وFournisseur\Auth\User يتعايشان. نعلن في الأعلى (namespace App\Modèles;) ونستورد بـ use App\Modèles\User;.

يحمِّل التحميل التلقائي (autoloading) تلقائيا ملف صنف عند أول استعمال له، عبر اتفاقية PSR-4 : يطابق فضاء الأسماء بنية المجلدات/الملفات (App\Modèles\User ← src/Modèles/User.php). انتهت قوائم require : لم يعد رياد يضمِّن شيئا يدويا، والمحمل التلقائي يجد الملف الصحيح وحده.

2. ملحن (Composer) : الاعتمادات والمنظومة

ملحن (Composer) هو مدير الاعتمادات في PHP (مكافئ npm) : نعلن في composer.json، وcomposer install ينزل في vendor/ ويولد المحمل التلقائي (require 'vendor/autoload.php'; يحمل كل شيء). ويتيح الوصول إلى Packagist، مستودع ضخم لمكتبات مُجرَّبة (بريد، PDF، HTTP) — نثبت بدل إعادة الترميز.

كما مع npm : لا ننظم vendor/ أبدا (قابل لإعادة التوليد عبر install) وcomposer.lock يقفل الإصدارات الدقيقة (قابلية إعادة الإنتاج). يحتفظ رياد بتوازي node_modules/package-lock : الانضباط نفسه، والمنعكسات نفسها. كل الأطر (Laravel، Symfony) تقوم على هذا الأساس.

خطأ شائع في الفهم: « ملحن ليس سوى مُنزِّل، ويجب تثبيت (commit) vendor/ للاطمئنان ». لا. يحل ملحن الاعتمادات، ويثبت الإصدارات (lock) ويولد المحمل التلقائي — أكثر بكثير من تنزيل. وتثبيت vendor/ يلوث المستودع ويثبت ثنائيات : ننظم composer.json + composer.lock، ونعيد توليد vendor/ عبر install.
فضاءات الأسماء + التحميل التلقائي + ملحن من تعارض الأسماء إلى المنظومة فضاءات الأسماءفضاءات منطقية، use للاستيراد+التحميل التلقائي PSR-4فضاء الأسماء ← ملف، تحميل تلقائي+ملحن (Composer)composer.json، و vendor/، و lock، و Packagist require واحد 'vendor/autoload.php' يحمل أصنافكم وأصناف المكتبات.
من تعارض الأسماء إلى المنظومة
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) فضاءات الأسماء : يضع رياد أصنافه تحت App\Boutique، وتحتفظ المكتبة بفضائها — لا تصادم بعد. 2) التحميل التلقائي : يطابق كل فضاء أسماء مجلدا، ويُحمَّل الملف وحده عند الاستعمال. 3) ملحن : يثبت require مكتبة الإرسال مع اعتماداتها، ويثبت lock الإصدارات. الدرس : نظم، وحمل تلقائيا، وثبت المُجرَّب.

🔎 مثال ملموس — فضاء الأسماء و PSR-4 ومحمل ملحن التلقائي

ينظم رياد صنفه ويحمل كل شيء في سطر واحد.

email; }
}
// نقطة الدخول : تحميل واحد فقط
require 'vendor/autoload.php';
use App\Modeles\Utilisateur;
$client = new Utilisateur('riad@exemple-fictif.test');

القراءة : فضاء أسماء معلَن، ومحمل تلقائي وحيد، واستيراد بـ use، وإنشاء مباشر.

الدرس : لا require يدوي لملف الصنف — الاتفاقية تصنع الرابط.

مفردات القسم

فضاءات الأسماء (namespaces)
فضاءات منطقية تنظم الأصناف وتمنع التعارض ؛ إعلان namespace في الرأس، واستيراد بـ use.

مثال بسيط: App\Modèles\User مقابل Fournisseur\Auth\User عند رياد.

ما ليس كذلك: أسماء مسبوقة يدويا لتفادي التصادمات.

رد فعل: تسمية الفضاء منذ أول صنف في مشروع.

التحميل التلقائي (autoloading) (PSR-4)
تحميل تلقائي لملف صنف عند استعماله، عبر اتفاقية فضاء الأسماء ← مجلدات/ملفات.

مثال بسيط: App\Modèles\User موجود في src/Modèles/User.php.

ما ليس كذلك: أربعون require يدويا في رأس السكريبت.

رد فعل: احترام اتفاقية PSR-4 بدقة.

ملحن (Composer)
مدير اعتمادات PHP : تثبيت مكتبات، وتدبير إصدارات ومحمل تلقائي ؛ وقد حول المنظومة.

مثال بسيط: composer require مكتبة الإرسال لرياد.

ما ليس كذلك: ZIP منزلة ومضمنة يدويا.

رد فعل: التثبيت عبر ملحن، أبدا يدويا.

composer.json / vendor / lock
يعلن composer.json ؛ وينزل install في vendor/ (غير منظَّم، قابل لإعادة التوليد) + محمل تلقائي ؛ ويثبت composer.lock الإصدارات.

مثال بسيط: lock منظَّم و vendor/ مُتجاهَل عند رياد.

ما ليس كذلك: vendor/ منظَّم بآلاف الملفات.

رد فعل: تنظيم json + lock، وتجاهل vendor/.

Packagist / المنظومة
مستودع حزم PHP : آلاف مكتبات قابلة لإعادة الاستعمال — تثبيت المُجرَّب بدل إعادة الترميز.

مثال بسيط: مكتبة إرسال SMTP مثبتة بأمر واحد.

ما ليس كذلك: إعادة كتابة إرسال بريد هش خاص.

رد فعل: البحث عن المُجرَّب قبل ترميز خاص.

في التطبيق — تنظيم مشروع حديث وربطه

  1. أعلنوا فضاءات أسماء (`namespace App\Modèles;`) لتنظيم أصنافكم وتفادي التعارض ؛ واستوردوا بـ `use`.
  2. هيئوا ملحن (`composer init`) وافهموا التحميل التلقائي PSR-4 (فضاء الأسماء ← مجلدات) : لا حاجة لتضمين كل صنف.
  3. ثبتوا مكتبة خارجية (`composer require ...`) واستعملوها عبر المحمل التلقائي (`require 'vendor/autoload.php';`).
  4. تذكروا : لا تنظيم لـ vendor/ (قابل لإعادة التوليد)، و composer.lock يثبت الإصدارات — كما node_modules/package-lock لـ npm.
تنظمون مشروعا حديثا (فضاءات أسماء دون تعارض، وتحميل تلقائي) وتستغلون المنظومة عبر ملحن (تثبيت مكتبات) — أساس PHP الاحترافية والأطر.

نص جاهز للقول — عرض مشروع مهيكل (30 ثانية)

« المشروع مُسمَّى الفضاء تحت App، بـ PSR-4 : كل صنف يُحمَّل تلقائيا. والاعتمادات تمر عبر ملحن، مثبتة في vendor غير منظَّم، والإصدارات مثبتة بالـ lock. require واحد للمحمل التلقائي في المدخل. »

يُقال في المراجعة ؛ وتُعرَض الشجرة و composer.json.

نموذج نسخ-لصق — composer.json PSR-4 أدنى

{
  "name": "riad/boutique",
  "require": {
    "php": ">=8.1"
  },
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  }
}
// ثم : composer install
// الدخول : require 'vendor/autoload.php';

مستقل

يكفي composer.json بـ PSR-4 لترتيب أصناف عروض الأسعار.

مقاولة صغيرة في قسنطينة

يسمي رياد فضاء المتجر حسب الوحدة ليرمز فريقان دون تصادم.

فريق منتج

فرض PSR-4 + lock منظَّم لتثبيتات قابلة لإعادة الإنتاج في كل مكان.

مبتدئ

هذا الأسبوع : فضاء أسماء واحد، وصنفان محملان تلقائيا، وصفر require يدوي.

✓ ممارسات جيدة

  • تسمية الفضاء منذ البداية (تفادي تصادمات مستقبلية).
  • احترام PSR-4 حرفيا (فضاء الأسماء = مسار الملف).
  • تثبيت المُجرَّب عبر ملحن بدل إعادة الترميز.

✗ أخطاء شائعة

  • تنظيم vendor/ (مستودع ملوث، وتعرضات ثنائية).
  • تضمين الأصناف يدويا بدل المحمل التلقائي.
  • نسيان lock (إصدارات عائمة، وتثبيتات غير قابلة لإعادة الإنتاج).

النقاط الأساسية

  • فضاءات الأسماء : فضاءات منطقية ضد التعارض (يتعايش User اثنان). namespace + use للاستيراد.
  • التحميل التلقائي (PSR-4) : تحميل تلقائي عبر اتفاقية فضاء الأسماء ← مجلدات. انتهت التضمينات اليدوية.
  • ملحن (Composer) = مدير الاعتمادات (كـ npm) : التثبيت، وتنظيم الإصدارات، وتوليد المحمل التلقائي. composer.json، و vendor/ (غير منظَّم)، و composer.lock (مثبت).
  • أساس PHP الحديثة والاحترافية (كل الأطر) : تنظيم المشاريع الكبيرة، والتحميل التلقائي، واستغلال Packagist.

تحدي 48 ساعة — طبّق غدا

سموا فضاء صنفين بـ PSR-4 محملين بـ محمل تلقائي واحد، ثم ثبتوا مكتبة واحدة عبر ملحن.

قائمة الخروج من القسم
  • أعلن فضاءات الأسماء وأستوردها دون تردد.
  • أصنافي تُحمَّل دون require يدوي.
  • vendor/ عندي مُتجاهَل، و lock منظَّم.
تقييم ذاتي 1-5 : هل يحترم كل صنف اتفاقية PSR-4 ؟هل يمكنني إعادة التثبيت بالمطابقة عبر lock ؟

أسئلة شائعة

ماذا يغير ملحن حقا، ولماذا هو مركزي ؟

قبل ملحن : تنزيلات يدوية، وتضمينات يدوية، وإصدارات تُدار ذاتيا — منظومة حرفية. وبعد : تثبيت بأمر واحد مع حل الاعتمادات، ووصول إلى Packagist (آلاف مكتبات مُجرَّبة)، وإصدارات مُدارة (lock قابل لإعادة الإنتاج) ومحمل تلقائي مولَّد. إنه مكافئ npm : الانتقال من PHP الحرفية إلى PHP الاحترافية.

لماذا يعمل فضاء الأسماء والتحميل التلقائي معا ؟

تحل فضاءات الأسماء التعارضات (بادئة منطقية : يتعايش User اثنان)، ويحل التحميل التلقائي التضمينات (تحميل تلقائي). والرابط : تجعل اتفاقية PSR-4 فضاء الأسماء يطابق مسار الملف — فيستنتج المحمل التلقائي الملف من الاسم الكامل للصنف. التنظيم (فضاءات الأسماء) + التحميل (التحميل التلقائي) : نظام واحد ونظيف.

تحقّق من فهمك

أي ملف يعلن الاعتمادات والتحميل التلقائي PSR-4 ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 3أسئلة جديدة وأصعب للتحقق من مكتسباتك