🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ پویا
تداخل اسم‌های مشابه کلاس‌ها در افزونه‌های مختلف
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۳۱ خرداد ۱۴۰۲

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

سلام پویا

بله درواقع namespace یکی از دلایل استفاده ازش بخاطر همین موضوع هست

درواقع namespace میاد نام فایل رو نسبت به پوشه ای که داره شرطی میکنه یعنی میشه تو دوتا پوشه مختلف از یک نام استفاده کرد

اینم توضیحات خود سایت 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.

ترجمه اش :

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

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


ابوالفضل محجوب ۳۱ خرداد ۱۴۰۲، ۱۹:۲۰

با این شرایط توی کلاس autoload , متوجه شدم که namespace تعریف شده هم همراه اسم کلاس میاد و زمانی که قراره include بشه تولید خطا میکنه. با تابع str_replace درواقع namespace رو از اسم کلاس جدا کردم و مشکلم حل شد. آیا روشی که رفتم درسته؟ به عنوان مثال اگر namespace Test; تعریف کرده باشم و کلاس Users داشته باشم متغیر $class داخل تابع autoload مقدار Test\\Users برمیگردونه و مشکل ساز میشه. عبارت Test\\ رو با یک رشته خالی جایگزین کردم تا include به درستی صورت بگیره. اما به این فک میکنم اگه namespace‌های متفاوت داشته باشیم اون وقت تکلیف چیه؟ باید با شرط چک کنیم اونوقت؟( namespace‌های مختلف نمیدونم نیاز هست اصلا یا نه ولی داخل فایل‌های المنتور دیدم استفاده کردن)

پویا ۳۱ خرداد ۱۴۰۲، ۱۹:۳۴

و راه حل بهینه‌تر اینه که متناظر با namespace پوشه ایجاد کنیم درسته؟ یعنی تو مثال بالا که زدم کلاس Users رو داخل پوشه Testقرار بدیم

پویا ۳۱ خرداد ۱۴۰۲، ۱۹:۳۹

شما به طور کلی میتونید همه ی کلاس هاتون رو توی یک پوشه قرار بدین و فقط namespace هاشونو متفاوت در نظر بگیری این جواب میده ولی استاندارد و اصولی نیست و وقتی که میخوای سیستم autoload رو پیاده کنی مثل همین الان به مشکل میخوری

در واقع روش اصولی و درست استفاده از namespace اینجوری هست که نسبت به پوشه‌های موجود namespace رو تعیین کنی مثلا اگر Test\\User میزاری واقعا یک پوشه ای به اسم Test موجود داشته باشی و کلاس User درون اون پوشه بوده باشه اگر همین نکته رو رعایت کنی مشکلت برطرف میشه و کد هات درست کار میکنه

بهترین پاسخ
ابوالفضل محجوب ۳۱ خرداد ۱۴۰۲، ۲۰:۵۹