namespace چیست؟ - مقدمه و آشنایی (در PHP)

29 بهمن 1397
namespaces-in-OO-PHP-introduction

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

پیش نیاز: برای همراهی با این سری مقالات باید دانش قابل قبولی نسبت به برنامه نویسی شیء گرای PHP داشته باشید. اگر با برنامه نویسی شیء گرا آشنا نیستید می توانید از دوره ی آموزشی برنامه نویسی شیء گرای PHP استفاده کنید.

namespace چیست؟

اولین سوالی که در این زمینه برای ما پیش می آید این است که namespace چیست و چرا باید از آن ها استفاده کنیم. اجازه بدهید سوالتان را جواب بدهم:

همانطور که در برنامه نویسی پیشرفت می کنید و کدهای خصوصی خودتان را می نویسید، این کدها را روی هم انباشته می کنید. در برخی اوقات نیز برخی از پروژه ها آنقدر بزرگ هستند که حجم کدها در آن ها بسیار بالا می رود. کار کردن در این حجم از کد از نقطه نظر خاصی، سخت تلقی می شود و آن، حفظ کردن تمام نام هایی است که روی توابع، کلاس ها و ... گذاشته اید.

همانطور که می دانید زمانی که نامی را روی یک کلاس یا تابع می گذارید دیگر نمی توانید آن نام را روی تابع یا کلاس دیگری قرار دهید؛ در صورتی که چنین کاری انجام دهید به خطا برخورد خواهید کرد.

باید اعتراف کرد که به یاد داشتن نام توابع، کلاس ها، ثابت ها و انواع کدهایی که نوشته ایم کار سختی است.

حال پلاگین ها و کتابخانه ها را نیز به این وضعیتِ در هم ریخته اضافه کنید! باید هم مراقب کدهای خود باشیم، هم مراقب کلاس ها، توابع و ... رزرو شده در خودِ PHP و هم مراقب کدهایی که در یک کتابخانه یا پلاگین استفاده شده اند!

namespace ها در واقع روشی برای کپسوله سازی (encapsulation) هستند تا از این مشکل جلوگیری شود. گرچه این جمله ممکن است قلمبه و سلمبه جلوه کند اما ما هر روزه با مبحث namespace روبرو هستیم.

کامپیوتر یا تلفن همراه خود را در نظر بگیرید (هر سیستم عاملی که داشته باشد)؛ در این سیستم ها، directory هایی که داریم نقش namespace را بازی می کنند. همه می دانیم که فایل foo.txt را می توانیم در دو پوشه ی جداگانه داشته باشیم.  به طور مثال:

C:\Users\Roxo\Downloads\Documents\foo.txt

C:\Users\Roxo\Downloads\Music\foo.txt

ما یک فایل با یک نام واحد را به طور همزمان در دو مسیر (directory) جداگانه داریم اما می دانیم که این دو فایل به دلیل یکسان بودن نامشان نمی توانند در یک مسیر باشند. اگر بخواهید فایلی را با نام file.txt در مسیری قرار بدهید که فایلی با نام file.txt دارد، فایل دوم فایل اول را جایگزین می کند. این یک پروسه ی عادی برای همه ی ماست و همه از آن مطلع هستیم.

در PHP نیز همینطور است و هنگامی که یک تابع با نام function داشته باشیم دیگر نمی توانیم تابعی با همین نام تعریف کنیم. وب سایت رسمی PHP می گوید:

In the PHP world, namespaces are designed to solve two problems that authors of libraries and applications encounter when creating re-usable code elements such as classes or functions:

  1. Name collisions between code you create, and internal PHP classes/functions/constants or third-party classes/functions/constants.
  2. Ability to alias (or shorten) Extra_Long_Names designed to alleviate the first problem, improving readability of source code.

ترجمه:

namespaces ها در دنیای PHP برای حل دو مشکل اساسی طراحی شده اند که نویسندگان برنامه ها و کتابخانه ها، هنگام ساخت کدهایی با قابلیت استفاده ی چند باره، با آن برخورد می کنند:

  1. تصادم نام ها (مشکل یکی بودن نام دو تابع، کلاس و ...) بین کدهایی که خودتان می نویسید و کلاس ها، توابع و ثابت های داخلیِ PHP یا کلاس ها، توابع و ثابت هایی که مربوط به کدهای خارجی (پلاگین، کتابخانه و ...) هستند.
  2. ایجاد قابلیت کوتاه تر کردنِ نام گذاری های بسیار طولانی؛ این نام گذاری ها معمولا برای این استفاده می شوند که از مشکل اول (تصادم نام ها) جلوگیری کنند و یا خوانایی سورس کد را بهبود ببخشند.

قبل از به وجود آمدن namespace ها راه حل خاصی وجود نداشت.

به طور مثال WordPress برای جلوگیری از این مشکل، به نام تمامی فایل ها حروف "_WP" را اضافه می کند. فریم ورک Zend نیز برای دور زدن این مشکل از ساختار خاص و بسیاری طولانی برای نام گذاری فایل هایش استفاده می کند که شبیه "Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive" است.

ما می توانیم ثابت ها، کلاس ها و توابع PHP را در namespace ها قرار دهیم.

نحوه ی تعریف namespace ها

تمامی ثابت ها، توابع و کلاس های PHP به صورت پیش فرض در فضای global قرار می گیرند. این همان فضایی است که قبل از ساخته شدن namespace ها وجود داشت و نام ها در آن قرار می گرفتند.

برای تعریف یک namespace باید از دستور namespace در بالای فایل PHP خود استفاده کنید. توجه کنید که این دستور باید اولین خط در فایل PHP شما باشد (البته به استثناء دستور declare) و اجازه ندارید قبل از آن هیچ whitespace (فضای خالی مانند اسپیس یا اینتر) یا کدهایی به غیر از کد PHP قرار دهید.

مثال:

<?php
// define this code in the MyProject namespace
namespace MyProject;

هر کدی که پس از این کد نوشته شود مربوط به namespace ای به نام MyProject خواهد بود.

خلاصه ی مقاله

در این قسمت با مفهوم کلی namespace ها و دلایل استفاده از آن ها آشنا شدیم و من همینجا قسمت اول از این سری مقالات آموزشی را تمام می کنم. در قسمت های بعدی به سراغ نکات ریز تر و کاربردی تر در این مورد می رویم.

برای دسترسی به تمام مقاله های پیرامون namespace‌ ها در PHP لطفا روی این لینک کلیک کنید.

نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sajjadVa22
29 بهمن 1397
اقا دمت گرم خیلی منتظر این بودم. چقدش رو توضیح میدین؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
29 بهمن 1397
سلام دوست عزیز، ممنونم، لطف دارید. تمام مباحث Namespace ها نوشته شدن و توی این سری مقالات هم آورده شدن. در حال حاضر تمام قسمت های این سری روی سایت منتشر شده و میتونین مطالعه کنین: https://www.roxo.ir/tag/namespace-%D8%AF%D8%B1-php/

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.