فضای نام روشی برای دسته بندی کلاس ها، توابع و ... هست که مشکل همنامی در پروژه های بزرگ رو حل میکنه، در حالت عادی فضای نام، \ یا همون سراسری هست. یعنی هر کلاس، تابع یا ثابت که تعریف کنید، به صورت سراسری در تمام برنامه قابل استفاده هست.
ولی اگر از فضای نام استفاده بشه، باید برای استفاده از عناصر موجود، فضای نام قید بشه.
برای تعریف فضای نام روش های زیر وجود داره
1- تعریف فضای نام برای تمام محتویات فایل، که برای استفاده از عناصر این فایل در خارج از این فایل، باید به صورت ()myNameSpace\myFunction و ... عمل کرد
<?php
namespace myNameSpace;
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
2- ایجاد محدوده مشخص یا همون بلوک برای فضای نام، که برای استفاده از عناصر در خارج از این بلوک، باید به صورت ()myNameSpace\myFunction و ... عمل کرد
namespace myNameSpace
{
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
}
3- تعریف چند فضای نام در یک فایل، که محدوده هر فضای نام تا ابتدای تعریف فضای نام جدید معتبر هست.
<?php
namespace myNameSpace1;
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
namespace myNameSpace2;
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
که البته این روش پیشنهاد نمیشه و جایگزین بهتری داره:
<?php
namespace myNameSpace1
{
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
}
namespace myNameSpace2
{
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
...
}
4- تعریف فضای نام سلسله مراتبی
<?php
namespace My\Name\Space;
const MY_CONST = 0;
function myFunction(){}
class MyClass{}
در کل برای استفاده از عناصری که با هر کدام از روش های بالا در فضای نام تعریف می شند، باید قبل از نام عنصر، فضای نام قید بشه:
myNameSpace\myFunction();
My\Name\Space\myFunction();
...
البته در صورتی که مورد استفاده خارج از محدوده فضای نام فعلی باشه! مثلا اگر در فضای نام A باشم، و تابع f هم در همین فضای نام تعریف شده باشه، نیازی به قید فضای نام در هنکام فراخوانی تابع نیست.
همچنین برای استفاده از کلاس ها و عناصر سراسری در یک فضای نام، می بایست یک \ ابتدای فراخوانی گذاشته بشه، به این معنی که این عنصر متعلق به فضای نام سراسری هست، مثل DateTime\
و اما use
دستور use برای ایجاد یک نام مستعار کوتاه برای فضای نام ها استفاده میشه و نه include , ....!
مثلا به جای نوشتن Illuminate\Support\Facades\Request در جای جای برنامه، میشه یک نام کوتاه تر برای این فضای نام تعریف کرد و از این نام کوتاه به جای نام بلند استفاده کرد
use Illuminate\Support\Facades\Request as MyRequest;
حالا کلاس MyRequest همون Illuminate\Support\Facades\Request خواهد بود.
همچنین اگر as و نام مستعار نوشته نشند، php آخرین قسمت فضای نام رو به عنوان نام مستعار در نظر می گیره
use Illuminate\Support\Facades\Request;
که در این صورت، حالا کلاس Request نام مستعار Illuminate\Support\Facades\Request در نظر گرفته میشه