PDA

View Full Version : namespace ها و use ها در لاراول 5



tuytoosh
دوشنبه 24 فروردین 1394, 03:23 صبح
سلام دوستان

من یه مشکل مسخره ی بزرگ دارم.

هر بار که میام از Request استفاده کنم اینارو امتحان میکنم ببینم کدوم جواب میده :


use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Request;
use App\Http\Requests\Request;
use Illuminate\Support\Facades\Request;
use Request;


یا هر بار که میخوام از Auth استفاده کنم اینارو چک میکنم :
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Auth;
use Illuminate\Auth;
use Illuminate\Contracts\Auth;
use Illuminate\Foundation\Auth;


و برای بقیه هم همینجوری .

کلا نمیدونم namespace و use چیه...

:ناراحت:

tuytoosh
دوشنبه 24 فروردین 1394, 03:32 صبح
چرا تو این انجمن من فقط سوال میپرسم ؟ :خجالت:

tresa022
دوشنبه 24 فروردین 1394, 04:03 صبح
namespace :مسیر فایل رو برای auto load صدا میزنه(البته تجربه شخصی بندس)
use :همون ایمپورت کردن کلاسه

tresa022
دوشنبه 24 فروردین 1394, 04:08 صبح
http://stackoverflow.com/questions/28376462/laravel-5-namespaces
اینجا کامل توضیح داده شده متوجه نشدی بگو برات بگم جریان چیه

hamedarian2009
دوشنبه 24 فروردین 1394, 09:52 صبح
فضای نام همون خاصیت کپسوله سازی شی گرایی رو پیاده سازی می کنه یعنی یک دسته کلاس های مرتبط به هم رو داخل یک namespace قرار می دین و مشکل هم نام بودن نام کلاس ها و متدها را هم حل میکنه لاراول ۵ به خوبی از این خاصیت استفاده کرده
use هم شبیه همون include -require هست کلاس هارو باید برای استفاده اول import کرد

rezakho
دوشنبه 24 فروردین 1394, 12:19 عصر
فضای نام روشی برای دسته بندی کلاس ها، توابع و ... هست که مشکل همنامی در پروژه های بزرگ رو حل میکنه، در حالت عادی فضای نام، \ یا همون سراسری هست. یعنی هر کلاس، تابع یا ثابت که تعریف کنید، به صورت سراسری در تمام برنامه قابل استفاده هست.

ولی اگر از فضای نام استفاده بشه، باید برای استفاده از عناصر موجود، فضای نام قید بشه.

برای تعریف فضای نام روش های زیر وجود داره

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 در نظر گرفته میشه