آموزش جامع Namespace در PHP به زبان ساده و کاربردی
مقدمه: Namespace در PHP چیست و چرا به آن نیاز داریم؟
تصور کنید در یک هارد دیسک، اجازه نداشته باشید فولدر بسازید و مجبور باشید تمام فایلهای خود را در ریشه درایو ذخیره کنید. در این حالت، اگر دو فایل با نام report.pdf داشته باشید، سیستمعامل به شما اجازه ذخیره هر دو را در یک مکان نمیدهد. در دنیای برنامهنویسی PHP نیز وضع به همین منوال است.
وقتی پروژههای شما بزرگتر میشوند یا از کتابخانههای جانبی (Package) استفاده میکنید، احتمال اینکه دو کلاس با نام کاملاً یکسان (مثلاً Database یا User) ایجاد شوند بسیار زیاد است. این مشکل را تداخل نامها (Naming Collision) مینامند. از نسخه 5.3 به بعد، PHP مفهومی به نام Namespace (فضای نام) را معرفی کرد تا این مشکل را به طور کامل حل کند.
۱. نحوه تعریف یک Namespace در PHP
برای تعریف فضای نام، از کلمه کلیدی namespace در ابتداییترین بخش فایل PHP (قبل از هرگونه کد دیگر به جز دستور declare) استفاده میکنیم. به مثال زیر توجه کنید:
namespace App\Database;
class Connection {
public function connect() {
return "به پایگاه داده متصل شد!";
}
}
در کد بالا، کلاس Connection درون فضای نام App\Database قرار گرفته است. حالا این کلاس از کلاسهای همنام در فضاهای نام دیگر کاملاً متمایز است.
۲. نحوه استفاده از کلاسهای دارای Namespace
برای استفاده از کلاسی که درون یک فضای نام قرار دارد، سه روش اصلی وجود دارد:
روش اول: آدرسدهی کامل (Fully Qualified Name)
در این روش، مسیر کامل کلاس را در هر بار نمونهسازی مینویسیم:
$db = new \App\Database\Connection();
echo $db--->connect();
روش دوم: استفاده از کلمه کلیدی use
این روش استانداردتر و تمیزتر است. با استفاده از use در بالای فایل، کلاس مورد نظر را وارد (Import) میکنیم:
use App\Database\Connection;
$db = new Connection();
echo $db--->connect();
۳. مستعار سازی (Aliasing) با کلمه کلیدی as
گاهی اوقات دو کلاس با نام یکسان را از دو فضای نام متفاوت وارد یک فایل میکنیم. برای جلوگیری از تداخل، میتوانیم به یکی از آنها یا هر دو یک نام مستعار اختصاص دهیم:
use App\Database\Connection as DbConnection;
use ExternalLib\Database\Connection as ExternalConnection;
$localDb = new DbConnection();
$extDb = new ExternalConnection();
۴. فضای نام سراسری (Global Namespace) چیست؟
توابع و کلاسهای پیشفرض PHP (مثل Exception یا PDO) در فضای نام سراسری قرار دارند. اگر داخل یک فایل که دارای namespace است بخواهید از این کلاسها استفاده کنید، باید یک بکاسلش (\) قبل از نام آنها قرار دهید تا PHP بداند منظور شما فضای نام سراسری است:
namespace App\Services;
class Payment {
public function charge() {
// استفاده از کلاس Exception سراسری
throw new \Exception("خطا در درگاه پرداخت");
}
}
۵. استاندارد PSR-4 و Autoloading
در پروژههای مدرن PHP، هیچگاه فایلها را به صورت دستی require یا include نمیکنند. به جای آن، از استانداردی به نام PSR-4 استفاده میشود که نامگذاری فضاهای نام را مستقیماً به ساختار پوشهبندی پروژه متصل میکند. با استفاده از ابزار Composer، کلاسها به طور خودکار بارگذاری میشوند که سرعت و ساختاریافتگی پروژه شما را به شدت بهبود میبخشد.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید