مساحات الأسماء والتحميل التلقائي
بالنسبة للمشاريع الصغيرة، تكفي 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");
?>
قواعد مساحة الأسماء:
- يجب أن يكون
namespaceأول سطر في الكود (مباشرةً بعد<?php) - استخدم الخطوط المائلة العكسية
\لفصل المستويات (نفس الحرف المستخدم في مسارات Windows، لكن بمعنى مختلف) App\Utilsيتوافق مع الدليلApp/Utils/
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.📖 ملخص
- تعمل مساحات الأسماء على حل تعارضات أسماء الفئات:
namespace App\Utils; useيستورد الفئات،asينشئ أسماء مستعارة- Composer هو مدير الحزم في لغة PHP (
composer require xxx) - PSR-4:
App\Models\User→app/Models/User.php vendor/autoload.php—سطر واحد يقوم بتحميل جميع الفئات تلقائيًا- داخل مساحة الأسماء، استخدم البادئة
\أوuseللفئات المدمجة
📝 تمارين
- قم بإنشاء بنية مشروع بسيطة:
app/Models/User.phpوapp/Utils/Validator.php، بحيث يحتوي كل منهما على إعلانات مساحة الاسم الخاصة به. قم باستيرادهما واستخدامهما فيpublic/index.phpمعuse. - قم بتثبيت Composer، واستخدم
composer initلتهيئة مشروع، وقم بتكوين التحميل التلقائي وفقًا لمعيار PSR-4 في ملف composer.json. - قم بتثبيت حزمة تابعة لجهة خارجية (مثل
ramsey/uuidلإنشاء معرّفات UUID) وافهم دور دليل المورد وملف autoload.php.



