نظّم كودك بمساحات أسماء PSR-4، ودع Composer يُحمِّل عنك الأصناف والاعتماديات.
افتح هذا الدرس في Kodokonتُلغي مساحات الأسماء تصادمات الأسماء: إذ يمكن لمكتبتين أن تعرّف كل منهما صنفًا باسم Client دون تعارض. والعُرف الشامل: بادئة مورّد (App، Acme\Blog)، ثم مساحات أسماء فرعية تعكس شجرة المجلدات. تستورد use اسمًا مؤهَّلًا بالكامل إلى الملف الحالي، وتعيد as تسميته عند الالتباس. ملف واحد = صنف واحد = مساحة أسماء واحدة: وهذا الانضباط ليس نزوة أسلوبية، بل هو الشرط الأساسي للتحميل التلقائي.
<?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,
) {
}
}يُحمِّل التحميل التلقائي ملفات الأصناف عند الطلب: فلا حاجة بعد الآن إلى require يدوي. ويحدّد المعيار PSR-4 الربط: تُقرَن بادئة مساحة أسماء بمجلد جذر، وتصبح كل مساحة أسماء فرعية مجلدًا فرعيًا. وهكذا يُحَلّ App\Service\UserService إلى src/Service/UserService.php. وخلف الكواليس، يعتمد كل شيء على spl_autoload_register - وإليك التنفيذ الأدنى، الجدير بالفهم حتى لو لم تُعِد كتابته أبدًا:
<?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';يُصنِّع Composer كل هذا: يصرّح composer.json باعتمادياتك وبربط PSR-4 لديك - نموذجيًا "autoload": { "psr-4": { "App\\\\": "src/" } } - ثم يُنزِّل composer install الحِزم إلى vendor/ ويولّد vendor/autoload.php، وهو الـ require الوحيد لتطبيقك بأكمله. وثمة تمييز جوهري: require للحزم اللازمة في الإنتاج، وrequire-dev لأدوات العمل (الاختبارات، التحليل الساكن)، المستبعَدة من عمليات النشر بـ --no-dev.
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\Blog\PostRepository إذا كانت البادئة App\ تشير إلى src/؟composer require --dev؟