
در خیلی از زبان های برنامه نویسی سطح بالا namespace ها وجود دارند .
فضای نام یا namespace ها مشخص کننده هویت کلاس و تابع می شوند و به نوعی باعث سازماندهی کلاس ها با توجه به ویژگی هایشان می شوند .
کد زیر توضیح دهنده مورد 1 هست :
<?php namespace Posts; class Article{ const publisher = "RapidCode.iR" public $ID = 0; public $title = "" public $content = "" public function create_article(int $id ,string $title ,string $content){ $this->ID = $id; $this->title = $title; $this->content = $content; } public function get_article(int $id){ if($this->ID != $id) return "Article Not Found !" return "{$this->title} : {$this->content}" } public static function get_publisher(){ return self::publisher; } } class Product{ // می تواند علاوه بر ویژگی های بالا ویژگی های دیگری هم داشته باشد . } ?>
با توجه به مورد 2 : همانطور که مشاهده می کنید namespace با نام posts داریم که به عنوان سردسته می باشد و زیر دسته های آن کلاس های Article و Product می باشد . و زمان استفاده خیلی منظم و با توجه به نامی که دارند خیلی مرتبط و با نظم استفاده می شود .
به طور عادی اگر 2 کلاس هم نام داشته باشیم پس از اجرای آن با خطای :
Cannot declare class * because the name is already in use in
کلاس مورد نظر از قبل تعریف شده است مواجه می شویم .
همانند کد زیر :
<?php class Admin{ // بخش مدیریت وبلاگ const url = "https://blog.rapidcode.ir" } ?>
<?php class Admin{ // بخش مدیریت فروشگاه const url = "https://shop.rapidcode.ir" } ?>
و در پایان که 2 فایل بالا را در index.php استفاده می کنیم
فایل index.php ( خطای تکرار نام )
require_once "a.php" require_once "b.php"
راه حل : از تگ php فایل a.php و b.php فضای نام Blog و Shop را همانند زیر اضافه کنید .
فایل a.php :
namespace Blog;
فایل b.php :
namespace Shop;
توجه : باید namespace را در بالا اسکریپت خود استفاده کنید .
<?php require_once "a.php" require_once "b.php" $admin_blog = new Blog\Admin(); $admin_shop = new Shop\Admin(); echo $admin_blog::url; #https://blog.rapidcode.ir echo "\n" echo $admin_shop::url; #https://shop.rapidcode.ir ?>
فایلی با نام posts.php داریم .
<?php namespace Posts; function vprint($name){ return "hello {$name}" } class Article{ const publisher = "RapidCode.iR" public $ID = 0; public $title = "" public $content = "" public function create_article(int $id ,string $title ,string $content) { $this->ID = $id; $this->title = $title; $this->content = $content; } public function get_article(int $id){ if($this->ID != $id) return "Article Not Found !" return "{$this->title} : {$this->content}" } public static function get_publisher(){ return self::publisher; } } ?>
در صورتی که بخواهیم از کلاس Article استفاده کنیم ابتدا باید namespace آن را وارد کنیم برای اینکار 2 راه داریم یا از خود کلیدواژه namespace استفاده کنیم یا use .
بهتر است از use استفاده کنید ، خیلی انعطاف پذیر تر از namespace است .
<?php namespace Posts; // واردسازی فضای نام posts require_once "posts.php" $article = new Article(); ?>
use Posts\Article; $article = new Article();
امکان استفاده از نام مستعار هم وجود دارد :
use Posts\Article as article; $article = new article(); echo article::publisher; // RapidCode.iR echo $article::publisher; // همان خروجی
استفاده از تابع که زیر مجموعه فضای نامی است :
echo Posts\vprint("@rman"); // hello @rman
$article = new Posts\Article; $article->create_article(23 , "مقاله ی جدید", "محتوای مقاله جدید"); echo $article->get_article(23); // مقاله ی جدید : محتوای مقاله جدید
echo Posts\Article::get_publisher(); // RapidCode.iR echo "<br>" echo Posts\Article::publisher; // RapidCode.iR
<?php namespace Posts; class Article{ public static function get_namespace(){ return __NAMESPACE__; } } $article = new Article(); echo Article::get_namespace(); // Posts ?>