فضاهای نام (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 استفاده کنیم؟
- جلوگیری از تداخل نام: دو کلاس همنام بدون مشکل
- سازماندهی بهتر: کدهای مرتبط در یک namespace
- Autoload: بارگذاری خودکار کلاسها
- استفاده از کتابخانهها: Composer و PSR-4
این مبحث بخشی از دوره آموزش کامل PHP است.