در حال بارگذاری ... .
Namespace(فضای نام) درPHP

در پروژه های بزرگ  که تعداد کد ها زیاد است، کنترل نام متغیر ها و کلاس ها  نیزمشکل میباشد.

اگر با هریک از  زبان برنامه نویسی (از جمله : C# ,C++ یا جاوا و…) کار کرده باشید؛ شاید با  مفهوم namespace  (شاید با نام های  دیگر) آشنا باشید. بطور کلی اگر چند متغیر یا تابع هم نام تعریف کنید به مشکل بر خواهید خورد. حتی  تا به حال شاید برایتان پیش آمده باشد که  هنگام انتخاب نام متغیر ها و کلاس ها و … با خطای نام یکسان مواجه شوید که دلیل آن تکرار آن کد  در کد های بالاتر میباشد.

همچنین اگر بخواهید کامپوننت یا پلاگین شخص دیگری را به پروژه  خود اضافه کنید  احتمال این که چند تا از کلاس ها ی این پلاگین ها با کلاس های شما یکسان باشد ، وجود دارد.

یکی از ویژگی های مهم، که در PHP 5.3 اضافه شد؛ فضای نام یا namespace بود. با استفاده از namespace ها میتوانید چندین تابع با نام یکسان داشته باشید و این توابع رو با توجه به فضای نامی آنها استفاده کنید.فضای نامی همان کپسوله سازی یا فایل بندی کردن میباشد( همانند دایرکتوری در سیستم عامل.)همچنین علاوه بر موارد بالا شما را قادر می سازد تا از تمام مزایای  autoloader هایی که از جدیدترین استانداردها پیروی کنید، که شامل اتولودر کامپوزر (Composer’s autoloader) هم می‌شود بهره ببرید.

نکته:

* خط تعریف namespace باید اولین دستور در بالای کدها و قبل از هر کد دیگری باشد(البته به استثناء دستور (declare.همچنین طبق استاندارد PSR-2 باید یک خط خالی بعد از تعریف namespace با بقیه کد ها وجود داشته باشد.

مثالی از کد غلط

 

قبل از کدهای PHP از کدِ HTML استفاده شده است که باعث بروز خطا می شود.

* داخل یک namespace هم طبیعتا نمی توان کلاس‌ها یا تابع‌ها یا ثابت‌های هم نام تعریف کرد.

*می توان namespace های مختلفی را در یک فایل داشته باشید اما طبق گفته ی متخصصین و خود وب سایت PHP این کار اصلا استاندارد نبوده، توصیه نمی شود و تا حد امکان باید از آن دوری کرد. سعی کنید هر namespace را در یک فایل جداگانه داشته باشید.

چه زمانی به استفاده از namespace نیاز پیدا می کنیم؟

فضای پیش فرض شما برای نوشتن کد PHP فضای سراسری (global space) میباشد و شما در این فضا نمیتوانید از دوکلاس ، تابع یا ثابت هم نام استفاده کنید؛ در غیر اینصورت با fatal error رو به خواهید شد.(همانطور که دو نمونه با نام یکسان درون یک فایل نمیتوان داشت)

اما با تعریف namespace  که با این کار به نوعی کلاس ها و تابع ها و ثابت‌هامون رو بخش بندی خواهیم کرد و دیگر خبری از تداخل نیست.

برای نمونه داریم:

در فایل  lib1.php، یک ثابت و یک تابع و یک کلاس تعریف کرده ایم و namespace آنرا App\Lib1 قرار داده ایم:

صدا زدن (call) کدهای بالا در فایل دیگر برای مثال فایل: myapp.php

 

سوال:ا گر بخواهیم namespace ها را فراخوانی کنیم مجبوریم آدرس کامل namespace را ارائه بدهیم،مگر قرار نبود یکی از مزایای استفاده از namespace ها این باشد که دیگر مجبور به استفاده از نام های طولانی و غیره نشویم؟ با این پسوند های پشت سر هم، نام ها باز هم طولانی می شوند. این که شد همان آش و همان کاسه!

پاسخ: باید توجه کنید فایده ی اصلی namespace ها این بود که نیازی به حفظ کردن نام توابع، کلاس ها و … نداشته باشیم و دور شدن از نام های طولانی تنها یکی از فایده های namespace ها است.

البته به کمک دستور use این مشکل هم حل شدنیست.

این کار را با کلمه ی کلیدی as به معنی “به عنوان” انجام می دهیم ؛ به اینصورت که قبل از استفاده از نام های طولانی با دستور بالا تبدیل به اسم های کوتاه تر میکنیم :

as short name> long name <use

در کد myapp.php هیچ namespaceایی تعریف نشده، بنابراین در فضای global هستیم. از آنجاییکه MYCONST و MyFunction و MyClass در فضای نام App\Lib1 تعریف شده‌اند شما به طور مستقیم قادر به فراخوانی آنها نیستید و بایستی پیشوند \App\Lib1 را اضافه کنید تا یک نام fully-qualified داشته باشید. در نهایت خروجی زیر را خواهید داشت:

پیامد های استفاده نکردن از namespace :

  • تداخل نام بین کدهایی که شما ایجاد کردید، و کلاس ها و ثابت ها و توابع داخلی PHP و یا کلاس ها و ثابت ها و توابع یک کامپوننت دیگر.
  • برای حل مشکل نام های طولانی و توصیفگر یا پیشوند گذاری که قبل بعضی نام ها استفاده می‌شد. که این کار خودش به نوعی کار برنامه‌نویس را سخت‌تر می‌کرد.

سه راه دسترسی به این فایل ها:

  • نام فایل به صورت نسبی (Relative) باشد مانند txt. که این مسیر به currentdirectory/foo.txt تبدیل می‌شود که currentdirectory همان دایرکتوری جاری است که در آن قرار داریم.
  • آدرس دهی نسبی مثل subdirectory/foo.txt که به currentdirectory/subdirectory/foo.txt تبدیل میشود.
  • آدرسی دهی مطلق مانند /main/foo.tex که تبدیل میشود به /main/foo.tex (یعنی خودش).

جمع بندی

بطوری کلی اگه بخوایم namespace  راحت تر توضیح بدیم:

Namespace میاد یه سری کد های مرتبط به هم که درون یک صفحه قرار دارند  سر برگ قرار میده که این سربرگ همان  namespace  است ؛ بنابراین namespace  همانند فولدرهای درون  یه درایو عمل میکنه ؛ یعنی  ممکنه هر چیزی که داخل یه فولدرقرار داشته باشه میتونه داخل فولدر دیگه هم باشد (توابع و متغیر های یکسان) ولی چون آدرساشون فرق میکنه مشکلی پیش نمیاد. هر موقع هم نیاز به استفاده بود با صدا زدن سربرگ ها (namespace) قابل استفاده اند.

, , ,
اشتراک گذاری:

دیدگاه‌ها

یک دیدگاه

مایل به ثبت دیدگاه هستید؟

آخرین دیدگاه‌ها

آخرین دیدگاه‌ها

بایگانی‌ها