Kodokon kodokon.com

مساحات الأسماء، التحميل التلقائي وComposer

نظّم كودك بمساحات أسماء PSR-4، ودع Composer يُحمِّل عنك الأصناف والاعتماديات.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

تُلغي مساحات الأسماء تصادمات الأسماء: إذ يمكن لمكتبتين أن تعرّف كل منهما صنفًا باسم Client دون تعارض. والعُرف الشامل: بادئة مورّد (App، Acme\Blog)، ثم مساحات أسماء فرعية تعكس شجرة المجلدات. تستورد use اسمًا مؤهَّلًا بالكامل إلى الملف الحالي، وتعيد as تسميته عند الالتباس. ملف واحد = صنف واحد = مساحة أسماء واحدة: وهذا الانضباط ليس نزوة أسلوبية، بل هو الشرط الأساسي للتحميل التلقائي.

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
ملف src/Service/UserService.php: مساحة الأسماء، الاستيرادات، الاسم البديل.

يُحمِّل التحميل التلقائي ملفات الأصناف عند الطلب: فلا حاجة بعد الآن إلى require يدوي. ويحدّد المعيار PSR-4 الربط: تُقرَن بادئة مساحة أسماء بمجلد جذر، وتصبح كل مساحة أسماء فرعية مجلدًا فرعيًا. وهكذا يُحَلّ App\Service\UserService إلى src/Service/UserService.php. وخلف الكواليس، يعتمد كل شيء على spl_autoload_register - وإليك التنفيذ الأدنى، الجدير بالفهم حتى لو لم تُعِد كتابته أبدًا:

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
مُحمِّل تلقائي PSR-4 مصنوع يدويًا: بادئة، مجلد جذر، تحويل إلى مسار.

يُصنِّع Composer كل هذا: يصرّح composer.json باعتمادياتك وبربط PSR-4 لديك - نموذجيًا "autoload": { "psr-4": { "App\\\\": "src/" } } - ثم يُنزِّل composer install الحِزم إلى vendor/ ويولّد vendor/autoload.php، وهو الـ require الوحيد لتطبيقك بأكمله. وثمة تمييز جوهري: require للحزم اللازمة في الإنتاج، وrequire-dev لأدوات العمل (الاختبارات، التحليل الساكن)، المستبعَدة من عمليات النشر بـ --no-dev.

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
دورة الحياة: التهيئة، وإضافة الاعتماديات، وإعادة توليد المُحمِّل التلقائي.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. وفقًا لـ PSR-4، أين يقع الصنف App\Blog\PostRepository إذا كانت البادئة App\ تشير إلى src/؟
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. أيّ ملف يجب أن تُضمِّنه للاستفادة من التحميل التلقائي الذي يولّده Composer؟
    • composer.json
    • vendor/autoload.php
    • ملف autoload.php تُنشئه في الجذر
  3. ما وظيفة composer require --dev؟
    • تثبيت حزمة خاصة بالتطوير فقط، مستبعَدة من عمليات النشر بـ --no-dev
    • تثبيت نسخة غير مستقرة من الحزمة
    • تثبيت الحزمة عالميًا على الجهاز