تعداد بازدید: 2456

منطق Namespace در PHP

دوتابع با نام یکسان Fatal Error است. برای جلوگیری از این خطا می توانید یک prefix ابتدای نام تابع بنویسید تا احتمال برخورد را کم کنید. روند بهتر این است که توابع با هدف خاص را در یک کلاس قرار دهید و prefix را به ابتدای نام کلاس اضافه کنید.

به طور مثال اگر نام تابع یا کلاس باید get_posts باشد بهتر است یک prefix به طور مثال با نام rng_ استفاده کنید تا احتمال برخورد را کم کنید.

get_posts ⇒ rng_get_posts

نکته : برای جلوگیری از Fatal Error می توانید قبل از تعریف کلاس یا تابع از عدم وجود آن با توابع function_exists , calss_exists اطمینان حاصل فرمایید.

<?php
if (!function_exists("function_name")) {
    function function_name() {
        
    }
}

if (!class_exists("class_name")) {
    class class_name {
        
    }
}

از توابع بالا به عنوان یک قانون کلی برای تعریف تابع یا کلاس استفاده نکنید. تنها زمانی که کتابخانه ها را فراخوانی می کنید استفاده کنید.

Namespace

در ابتدای هر فایلی اگر namespace تعریف شود تمامی توابع آن فایل با این namespace قابل فراخوانی هستند. به طور مثال ما فایل زیر را داریم :

namespace MyNamespace;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

echo __NAMESPACE__ . "\n";

namespace AnotherNamespace;

const CONNECT_OK = 0;
class Connection { /* ... */ }
function connect() { /* ... */  }

echo __NAMESPACE__ . "\n";

هر گاه بخواهیم یکی از توابع یا ثوابت یا کلاس های بالا را تعریف کنیم باید namespace را ابتدای آن بیاوریم.

echo MyNamespace\CONNECT_OK; //1
echo AnotherNamespace\CONNECT_OK; //0

پس دو تابع هم نام که namespace آن ها متفاوت است یکسان نیستند. یک فایل با دو namespace امکان پذیر نیست.

نمی توان پس از تعریف یک تابع یک namespace تعریف کرد. باید در ابتدا باشد. ولی می توان پس از تعریف یک namespace در ابتدای فایل namespace بعدی را پس از آن تعریف کرد(مثال بالا).

با استفاده از کلمه کلیدی use می توانید سرنخ namespace های خود را بدهید. به طور مثال ما یک تابع داریم که در یک فایل با namespace با مقدار src\functions که در آن توابع زیادی تعریف شده است.

namespace src\functions;

function func_one() { /* ... */  }
function func_tow() { /* ... */  }
function func_three() { /* ... */  }
function func_four() { /* ... */  }
function func_five() { /* ... */  }
function func_six() { /* ... */  }
function func_seven() { /* ... */  }

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

use src\functions;

functions\func_one();

از سرنخ src\functions تابع ها را می توانیم فراخوانی کنیم .هر قدر func_one را می توانیم نزدیک تر آدرس دهی کنیم.  مثلا تابع :

use src\functions\func_one;

func_one();

با استفاده از کلمه کلیدی use می توانیم چند namespace را سرنخ بدهیم :

use App\Controllers\ProductController;
use App\Models\Product;

$product_controller = new ProductController;
$product_model = new Product;

می توان پس از استفاده از namespace (use کردن آن) یک نام alias با استفاده از کلمه کلیدی as برای آن انتخاب کرد . معمولا برای خوانایی بیشتر و جلوگیری از conflict از این کار استفاده می شود:

use Mails\Product as ProductMail;
use App\Models\Product as ProductModel;

new ProductMail;
new ProductModel;

در مثال بالا ما دو کلاس با نام Product را سرنخ دهیم کرده ایم . اگر در فایل ما نام Product بیاوریم سیستم نمی تواند تشخیص بدهد که کدام Product منظور ماست . به همین دلیل یک alias برای آن ها تعریف کرده ایم که از برخورد جلوگیری می کند.

Redeclare PHP functions

با استفاده از namespace می توانیم توابع پیش فرض وردپرس را باز نویسی کنیم . برای این کار می توان از بوتسترپ استفاده کرد. (کتابخانه simple-file-uploader). در حقیقت ما تابع را بازنویسی نمی کنیم بلکه تابع را با یک namespace خاص مجزا می کنیم.

دو فایل با یک namespace دارای یک عملکرد رفتاری می باشند. یعنی اگر فایلی یک namespace داشت و یک تابع در آن فراخوانی شده بود برای اجرا ابتدا از روی namcespace به دنبال آن می گردد تا ببیند تابعی در فایلی با این namespace تعریف شده است یا خیر بعد در سایر فایل ها به دنبال آن می گردد.

فایل زیر با نام three.php دارای محتویات زیر است :

namespace Library;
function say_hello($name) {
    print($name);
}

فایل دیگری داریم با نام two.php که دارای محتوای زیر است :

namcespace Library;
function print($name){
   echo "hello {$name}";
}

فایل دیگری داریم با نام one.php که یکی از توابع فایل three.php را فراخوانی کرده است.

include "one.php";
include "tow.php";
say_hello("Abolfazl");

ما عملکرد تابع print را تغییر دادیم. چون فایل two.php از namepace با مقدار Library استفاده می کرد ما نیز فایلی دیگر قرار دادیم که با همین namespace بود و تابع php را بازنویسی کردیم. به این کار می گوییم تغییر عملکرد تابع بوسیله namespace .

Namespace Autoload Algorithm

سیستم عامل وقتی یک فایل را بخواهد صدا بزند با استفاده از مسیر آن را می شناسد. مثلا ما دو فایل با نام abolfazl.jpg داریم که یکی در دایرکتوری pictures و یکی در دایرکتوری photoes می باشد. این دو فایل :

D:\pictures\abolfazl.jpg
D:\photoes\abolfazl.jpg

این فایل ها نام های یکسان و دایرکتوری های متفاوت دارند. سیستم عامل به وسیله دایرکتوری ها این موارد را از هم تفکیک می کند. namespace نیز حکم همین دایرکتوری ها را دارد(نامگذاری مسیر در سیستم عامل ویندوز).

ما وقتی یک فایل با یک namespace تعریف می کنیم باید از یک سری الگوریتم خاص پیروی کنیم . یکی از این قوانین psr-4 می باشد. فرمول کلی این الگوریتم به شکل زیر می باشد :

<NamespaceName>\<DirectoryName>\<ClassName>

این الگوریتم قوانینی دارد که در composer استفاده می شود.

NamespaceName را باید خودمان تعریف کنیم که می تواند نام application ما نیز باشد.

DirectoryName مسیر فایل (نام دایرکتوری ها باید دقیقا در namesapce آورده شود.) می باشد .

ClassName نام فایل و نام کلاس می باشد. یعنی باید نام فایل و نام کلاس یکی باشد.

مطالب مشابه

FileSystem در PHP

رفتار تابعی در مقابله با فایل ها و دایرکتوری ها دقیقا مثل رفتار نرم افزار های FileManager ها در سیستم عامل هاست. Action...

composer یک ابزار رابط خط فرمان (command line interface) برای مدیریت و نصب پروژه های PHP می باشد. بوسیله آن می توان روی پروژه خود پکیج هایی (پروژه ها یا کتابخانه ها) را نصب کنید یا بالعکس پروژه خود را قابل نصب بر روی پروژه های دیگر کنید.

Composer (قسمت اول)

composer یک ابزار رابط خط فرمان (command line interface) برای مدیریت و نصب پروژه های PHP می باشد. بوسیله آن می توان روی...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

یک دیدگاه برای منطق Namespace در PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *