فضاهای نام (Namespaces)

سازماندهی کد با Namespaces در PHP — جلوگیری از تداخل نام، use، as و autoload

Namespace چیست؟

فضای نام (Namespace) مثل پوشه برای کلاس‌ها، توابع و ثابت‌هاست. اگر دو کلاس همنام دارید، با namespace می‌توانید تداخل را حل کنید.

تصور کنید namespace مثل آدرس پوشه است: App/Controllers/UserController مثل C:/Projects/App/Controllers/UserController

تعریف Namespace

// فایل: User.php
<?php
namespace App\Models;

class User {
    public function getName() {
        return "User از App\Models";
    }
}

// فایل دیگر: User.php
<?php
namespace App\Admin;

class User {
    public function getName() {
        return "User از App\Admin";
    }
}

استفاده از Namespace

<?php
// استفاده از نام کامل
$user1 = new \App\Models\User();
$user2 = new \App\Admin\User();

// استفاده از use
use App\Models\User as ModelUser;
use App\Admin\User as AdminUser;

$user1 = new ModelUser();
$user2 = new AdminUser();
?>

use — وارد کردن کلاس

<?php
// فایل کنترلر
namespace App\Controllers;

use App\Models\User;
use App\Services\EmailService;

class UserController {
    public function create() {
        $user = new User();  // نیازی به نام کامل نیست
        $email = new EmailService();
    }
}
?>

use با alias (as)

<?php
use App\Models\User as UserModel;
use App\Admin\User as AdminUser;

$modelUser = new UserModel();
$adminUser = new AdminUser();
?>

Namespace تو در تو

namespace App\Http\Controllers\API\V1;

class ProductController { }
// نام کامل: App\Http\Controllers\API\V1\ProductController

دسترسی به کلاس‌های سراسری

<?php
namespace App\Models;

class User {
    public function getDate() {
        // کلاس‌های سراسری با \ شروع می‌شوند
        return new \DateTime();
        // یا
        return \date("Y-m-d");
    }
}
?>

PSR-4 — استاندارد Autoload

استاندارد PSR-4 ارتباط بین namespace و ساختار پوشه را تعریف می‌کند:

// Namespace: App\Models\User
// فایل: app/Models/User.php

// Namespace: App\Http\Controllers\UserController
// فایل: app/Http/Controllers/UserController.php

Composer Autoload

// composer.json
{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}

// سپس: composer dump-autoload
// حالا همه کلاس‌های App\ به‌صورت خودکار بارگذاری می‌شوند

توابع و ثابت‌های Namespace

<?php
namespace App\Utils;

const MAX_SIZE = 1024;

function helper() {
    return "تابع کمکی";
}

// استفاده
echo \App\Utils\MAX_SIZE;
echo \App\Utils\helper();

// یا با use
use const App\Utils\MAX_SIZE;
use function App\Utils\helper;
?>

چرا از Namespace استفاده کنیم؟

این مبحث بخشی از دوره آموزش کامل PHP است.

ابزارهای مرتبط