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

بالنسبة للمشاريع الصغيرة، تكفي 3 فئات. لكن التطبيق الحقيقي قد يحتوي على 300 فئة بالإضافة إلى مكتبات الجهات الخارجية — حيث تُعد مساحات الأسماء و«كومبوزر» بمثابة «نظام التنظيم» في لغة PHP الذي يمنع تضارب الأسماء في الكود الخاص بك.

1. لماذا نحتاج إلى مساحات الأسماء؟

PHP
<?php
// Imagine you wrote a Logger class
class Logger {
    public function log(string $msg): void {
        echo "My log: {$msg}<br>";
    }
}

// You want to use a third-party package that also has a Logger class
// Result: PHP Fatal Error: Cannot redeclare class Logger
?>

تحل مساحات الأسماء هذه المشكلة — فكر فيها على أنها تمنح كل فئة «اسم عائلة»:

TEXT
Without namespace: Logger ← collision!
With namespace:    MyApp\Logger  vs  Vendor\Logger ← no collision!

2. تعريف مساحة الأسماء

PHP
<?php
// file: app/Utils/Logger.php
namespace App\Utils;

class Logger {
    public function log(string $msg): void {
        echo "[LOG] {$msg}<br>";
    }
}

// Use the fully qualified name
$log = new \App\Utils\Logger();
$log->log("App started");
?>

قواعد مساحة الأسماء:


3. الاستخدام — استيراد الفئات

PHP
<?php
namespace App\Controllers;

// After use import, you can use the short class name
use App\Utils\Logger;
use PDO;
use DateTime;

class UserController {
    public function index(): void {
        $log = new Logger();  // No need for the fully qualified name
        $log->log("Viewing user list");
        
        $now = new DateTime();  // PHP built-in classes can also be imported
    }
}
?>

(1) استخدام ... كـ — الأسماء المستعارة

PHP
<?php
// Resolve name conflicts
use App\Models\User as AppUser;
use Vendor\Cms\User as CmsUser;

$u1 = new AppUser();
$u2 = new CmsUser();
?>

4. Composer — مدير الحزم في لغة PHP

يُعتبر «Composer» بالنسبة إلى PHP ما يُعتبره «npm» بالنسبة إلى Node.js، وما يُعتبره «pip» بالنسبة إلى Python.

(1) تثبيت Composer

تفضل بزيارة https://getcomposer.org للتنزيل والتثبيت. بعد ذلك، في مجلد مشروعك:

BASH
# Initialize the project
cd myphp
composer init

# Install a package (using the popular .env config library as an example)
composer require vlucas/phpdotenv

▶ مثال: تكوين ملف composer.json والتحميل التلقائي

JSON
{
    "name": "myphp/demo",
    "description": "PHP Learning Project",
    "require": {
        "php": ">=8.0",
        "vlucas/phpdotenv": "^5.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}
▶ جرّب الكود

(2) استخدام التحميل التلقائي

PHP
<?php
// You only need to require this one file
require __DIR__ . '/vendor/autoload.php';

// Now you can use all Composer-managed packages and your custom classes
use App\Models\User;

$user = new User();
?>

5. التحميل التلقائي وفقًا لمعيار PSR-4

PSR-4 هو معيار التحميل التلقائي لمجتمع PHP — يتم ربط بادئة مساحة الاسم بالدليل:

مساحة الاسم الدليل مسار ملف الفئة
App\ app/ app/ هو الجذر
App\Models\User app/Models/User.php
App\Controllers\Admin\Dashboard app/Controllers/Admin/Dashboard.php

▶ مثال: هيكل المشروع وفقًا لمعيار PSR-4

TEXT
myphp/
├── app/
│   ├── Models/
│   │   └── User.php          ← namespace App\Models;
│   └── Controllers/
│       └── UserController.php ← namespace App\Controllers;
├── vendor/                   ← Created automatically by Composer
│   └── autoload.php
├── composer.json
└── public/
    └── index.php
▶ جرّب الكود
PHP
<?php
// app/Models/User.php
namespace App\Models;

class User {
    public function __construct(
        public string $name,
        public string $email
    ) {}
}
PHP
<?php
// public/index.php
require __DIR__ . '/../vendor/autoload.php';

use App\Models\User;

$user = new User("John", "john@example.com");
echo $user->name;  // John
?>

6. الأوامر الشائعة في Composer

BASH
# Install all dependencies listed in composer.json
composer install

# Add a new dependency
composer require guzzlehttp/guzzle
composer require --dev phpunit/phpunit  # Dev environment only

# Update all dependencies
composer update

# Update a specific package
composer update guzzlehttp/guzzle

# Generate optimized autoloader (production)
composer dump-autoload -o

7. الفئات المدمجة مقابل مساحات الأسماء

PHP
<?php
namespace App;

// Inside a namespace, call PHP built-in classes
$date = new \DateTime();          // Root namespace \
$pdo  = new \PDO($dsn, $user, $pass);

// Or use
use DateTime, PDO;

$date = new DateTime();
$pdo  = new PDO($dsn, $user, $pass);
?>
💡 نصيحة: داخل مساحة الاسم، يجب أن تُسبق الفئات المدمجة في PHP بالبادئة \ أو أن تُستورد باستخدام use. وبدون ذلك، يبحث PHP في مساحة الاسم الحالية (على سبيل المثال، App\DateTime)، وهي غير موجودة.

❓ أسئلة شائعة

س هل يجب أن تتطابق مساحات الأسماء مع مسارات الملفات؟
ج يتطلب معيار PSR-4 الاتساق، لكن صيغة PHP لا تفرض ذلك. يمكنك تسمية العناصر بشكل تعسفي عند استدعاء الملفات يدويًّا. لكن اتباع المعيار هو ما يجعل ميزة التحميل التلقائي في Composer تعمل.
س أين يتم تثبيت حزم Composer؟
ج في الدليل vendor/. عادةً ما لا يتم إدراج هذا الدليل في Git (يتم تكوينه في ملف .gitignore). ويقوم أعضاء الفريق بتشغيل composer install بأنفسهم.
س ما معنى ^5.0 في composer.json؟
ج إنه قيد خاص بنظام الترقيم الدلالي (SemVer). ^5.0 تعني قبول الإصدارات التي تكون >=5.0 و<6.0. ~5.0 تعني >=5.0 و<5.1.

📖 ملخص

📝 تمارين

  1. قم بإنشاء بنية مشروع بسيطة: app/Models/User.php وapp/Utils/Validator.php، بحيث يحتوي كل منهما على إعلانات مساحة الاسم الخاصة به. قم باستيرادهما واستخدامهما في public/index.php مع use.
  2. قم بتثبيت Composer، واستخدم composer init لتهيئة مشروع، وقم بتكوين التحميل التلقائي وفقًا لمعيار PSR-4 في ملف composer.json.
  3. قم بتثبيت حزمة تابعة لجهة خارجية (مثل ramsey/uuid لإنشاء معرّفات UUID) وافهم دور دليل المورد وملف autoload.php.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%