آموزش namespace در شی گرایی
namespce مفهومی است که به واسطه آن می توانیم به طور قطعی جلوی تداخل نام کلاس ها در شی گرایی را بگیریم.
namespace ها چه کار می کنند؟
می دانیم که نمی توانیم در یک فایل، دو تابع با نام یکسان تعریف کنیم:
function Product ($name) { return $name; } function Product ($size) { return $size; } //output: Fatal error: Cannot redeclare Product()
این دو تابع در یک فایل هستند. عملا در یک محدوده هستند که به آن محدوده namespace گفته می شود.
پس این دو تابع اکنون در یک namespace قرار دارند.
پس نمی توانیم در یک namespace دو تابع با نام یکسان داشته باشیم.
اگر یک فایل دیگر در این فایل ایمپورت شود، محدوده ی این دو فایل با هم یکسان می شود. یعنی namespace آن ها یکی می شود.
//one.php file function Product ($name) { return $name; } //two.php file require 'one.php'; function Product ($size) { return $size; } //output: Fatal error: Cannot redeclare Product()
حالا برای اینکه این تداخل نام در یک namespace رخ ندهد، کافیست برای هر کدام یک namespace جداگانه داشته باشیم.
یک namespace برای متد اول بسازیم و یک namespace برای متد دوم.
namespace چگونه ساخته می شود؟
برای ساختن یک namespace از کلمه کلیدی namespace استفاده می کنیم و سپس نام namespace را قرار می دهیم.
توجه کنید که ساختن namespace باید در ابتدای فایل انجام شود و قبل از آن کدی نوشته نشود:
namespace user;
برای مثال قبلی دو namespace جدا تعریف می کنیم:
namespace product1; function Product ($name) { return $name; } namespace product2; function Product ($size) { return $size; } //output: without error
خواهیم دید که هیچ خطایی ایجاد نمی شود چون هر متد در namespace یا فضای جداگانه ای تعریف شده اند.
نکته: بهتر است هر فایل فقط یک namespace داشته باشد. ما برای تفهیم مطلب از دو namespace استفاده کردیم
استفاده از متد در namespace دیگر
اگر بخواهیم در namespace فعلی، از متدی استفاده کنیم که در namespace است، باید نام آن namespace را به همراه متد آن بیاوریم:
namespace product1; function Product () { return 'Plugin'; } namespace product2; function Product () { return 'Theme'; } echo \product1\Product(); //output: Plugin
استفاده از ثابت در namespace دیگر
برای استفاده از ثابت در namespace دیگر، نیازی به استفاده از نام namespace نداریم:
namespace product1; define('Plugin', 'Plugin_name'); namespace product2; echo Plugin; //output: Plugin_name
namespace در شی گرایی
namespace ها در شی گرایی کاربرد زیادی دارند و بر روی مفاهیم مختلفی مثل constant، function ، interface، trait، abstract، class می توانند تاثیر بگذارند.
برای جلوگیری از تداخل نام موارد بالا در شی گرایی، بهترین راه حل استفاده از namespace می باشد.
برای مثال با استفاده از namespace می توانیم کلاس هایی با نام یکسان ایجاد کنیم:
namespace product1; class User{} namespace product2; class User{}
استفاده از کلاس در namespace دیگر
برای استفاده از کلاس در namespace دیگر، به همان روش متد استفاده می شود. یعنی باید نام namespace را بیاوریم:
namespace product1; class User{} namespace product2; new \product1\User();
معرفی کردن sub-namespace ها
معمولا برای استفاده از namespace ها، به فایل اصلی روت پروژه، namespace ای با نام فولدر روت می دهیم.
برای مثال پروژه ای به نام Biawp را در فولدری با همان نام داریم. پس namespace ما در فایل index.php اینگونه می شود:
namespace Biawp;
حالا فرض کنید در کنار فایل اصلی، فولدری به نام src داریم که قرار است برای فایل های آن یک namespace در نظر بگیریم:
namespace Biawp/Src;
به همین ترتیب می توانیم namespace فایل ها را نامگذاری کنیم.