در PHP 5.3 یک مفهوم دیگر به نام namespace(فضای نام) به این زبان اضافه شد. اکثر زبان های برنامه نویسی از قبل این ویژگی را داشتند، اما زبان PHP دیرتر از بقیه وارد صحنه شد. اجازه دهید تا کمی با مفهوم namespace و کاربردهای آن در php آشنا شویم.
در زبان برنامه نویسی PHP ، قادر نیستیم تا دو کلاس هم نام داشته باشیم. بعنوان مثال اگر بخواهیم از یک کتابخانه ی ثانویه در داخل کدهای خود استفاده کنیم که حاوی یک کلاس به نام User باشد، دیگر نمی توانیم در داخل کدهای خودمان، کلاسی به نام User ایجاد کنیم.
namespaceها در php به ما امکان می دهند تا این مشکل را حل کنیم. با استفاده از namespace می توانیم به هر تعداد که بخواهیم کلاس هایی با نام User (یا دیگر نام ها) ایجاد کنیم. اجازه دهید تا یک کلاس ایجاد کنیم و آن را مورد بررسی قرار دهیم:
namespace سراسری(Global)
در کدهای زیر، یک کلاس ساده را مشاهده می کنید:
<?php
// app/models/Eddard.php
class Eddard
{
}
هیچ کدی در داخل این کلاس وجود ندارد، و اگر بخواهیم این کلاس را مورد استفاده قرار دهیم، می توانیم به صورت زیر عمل کنیم:
<?php
// app/routes.php
$eddard = new Eddard();
به این کلاس، کلاس سراسری گفته می شود، و به این معنی است که این کلاس از هیچ namespace ای استفاده نمی کند. و یک کلاس عادی است.
استفاده از namespaceهای ساده
اجازه دهید تا در کنار کلاس سراسری Eddard، یک کلاس دیگر نیز ایجاد کنیم:
<?php
namespace Stark;
// app/models/another.php
class Eddard
{
}
همان طور که مشاهده می کنید، در اینجا یک کلاس دیگر به نام Eddard (همان نام قبلی) ایجاد کرده ایم. همچنین از دستور namespace نیز در خط شماره ی 3 استفاده کرده ایم. درواقع در خط شماره 3، عبارت ;namespace Stark به php اعلام می کند که، هر کدی که می نویسیم به فضای نام Stark تعلق دارد. این یعنی هر کلاسی که در داخل این فایل php ایجاد شود، در درون فضای نام Stark قرار دارد.
اکنون اگر دوباره با استفاده از کدهای زیر بخواهیم از کلاس Stark استفاده کنیم:
<?php
// app/routes.php
$eddard = new Eddard();
در حقیقت از همان کلاس اولیه نمونه گیری کرده ایم(شیء ایجاد کرده ایم). یعنی از همان کلاسی که در ابتدای این مقاله ایجاد کردیم. نه آن کلاسی که در داخل فضای نام Stark آن را ایجاد کردیم. اما اکنون اجازه دهید تا از کلاس Eddard که در داخل فضای نام Stark قرار دارد، نمونه گیری کنیم(شیء ایجاد کنیم):
<?php
// app/routes.php
$eddard = new Stark\Eddard();
برای اینکه بتوانیم از یک کلاس که در داخل یک فضای نام قرار دارد، نمونه گیری کنیم، باید قبل از نام آن کلاس، از نامِ فضای نامی که در داخل آن قرار دارد، استفاده کنیم و بین آن دو، یک بک اسلش(\) قرار دهیم. اکنون ما توانستیم از کلاس Eddard که در داخل فضای نام Stark قرار دارد، نمونه گیری کنیم.
باید بدانید که فضاهای نام در صورت نیاز می توانند سلسله مراتب داشته باشند. بعنوان مثال داریم:
This\Namespace\And\Class\Combination\Is\Silly\But\Works
تئوری نسبی بودن
زبان برنامه نویسی php همواره به صورت نسبی به فضاهای نام واکنش نشان می دهد. اجازه دهید تا این موضوع را در عمل مشاهده کنیم:
<?php
namespace Stark;
// app/routes.php
$eddard = new Eddard();
با اضافه کردن namespace در کدهای بالا، باعث شده ایم که php به داخل فضای نام Stark برود(در خط شماره 3). اکنون چون که در داخل فضای نام Stark هستیم، در خط شماره ی 7، در حقیقت از آن کلاس Eddard داریم نمونه گیری می کنیم که دارای فضای نام Stark است.
حالا که فضای نام را تغییر داده ایم(به Stark)، با یک مشکل کوچک مواجه خواهیم شد. مشکل این است که حالا چگونه می توانیم از کلاس Eddard اصلی(که فضای نامی ندارد) نمونه گیری کنیم؟ خوشبختانه در زبان php یک راه حل برای اشاره به کلاس هایی که در داخل فضای نام سراسری هستند، وجود دارد. تنها کافیست که از یک علامت بک اسلش(\) قبل از نام کلاس استفاده کنیم:
<?php
// app/routes.php
$eddard = new \Eddard();
با استفاده از علامت بک اسلش(\)، زبان php متوجه می شود که ما داریم به کلاس Eddard که در داخل فضای نام سراسری قرار دارد، اشاره می کنیم و می خواهیم از آن، نمونه گیری کنیم.
تصور کنید که یک کلاس دیگر به نام Tully\Edmure داریم. و می خواهیم از این کلاس، وقتی که در داخل فضای نام Stark هستیم، استفاده کنیم. چگونه باید این کار را انجام دهیم؟
<?php
namespace Stark;
// app/routes.php
$edmure = new \Tully\Edmure();
دوباره می توانیم از یک بک اسلش، قبل از نام این کلاس استفاده کنیم تا به فضای نام سراسری برگردیم، قبل از اینکه از کلاس Edmure که در فضای نام Tully قرار دارد نمونه گیری کنیم.
یعنی ابتدا با استفاده از یک بک اسلش، به فضای نام سراسری می رویم، و سپس از کلاس Edmure که در فضای نام Tully قرار دارد نمونه گیری می کنیم.
اشاره به کلاس هایی که در داخل فضاهای نام متفاوتی هستند، به صورت سلسله مراتب، کمی خسته کننده است. خوشبختانه یک راه میانبر برای انجام این کار وجود دارد. و آن استفاده از دستور use است. به مثال زیر توجه کنید:
<?php
namespace Stark;
use Tully\Edmure;
// app/routes.php
$edmure = new Edmure();
با استفاده از دستور use می توانیم در داخل فضای نام جاری، از یک کلاس که در یک فضای نام دیگر قرار دارد، استفاده کنیم. این روش به ما امکان می دهد تا تنها با استفاده از نام آن کلاس، از آن نمونه گیری کنیم.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
READ MORE