PDA

View Full Version : آموزش: آموزش کار با namespace در php 5.3 به بالا



mtnam1372
سه شنبه 29 مرداد 1392, 05:44 صبح
در این مقاله ابتدا از سایت php.net شروع کردم که . بهترین نکات فنی رو داره بعد از اون هم . اگر دوستان علاقه
داشته باشند از تئوری به کاربردی میرسیم

Namespace چیست؟

Namespace چیست؟ معنای کلی namespace ، کپسوله سازی آیتم هاست. بطور مثال در تمام سیستمهای عامل ، دایرکتوری (پوشه ها) برای دسته بندی فایلهای مرتبط بکار میروند و مانند یک namespace برای فایلهای موجود در آن عمل میکنند. بعنوان یک مثال دقیقتر ، فرض کنید که فایل foo.txt در پوشه های home/greg و home/other وجود دارد اما امکان همزیستی دو کپی از فایل foo.txt در یک پوشه وجود ندارد. بعبارت دیگر ، بنابراین برای اینکه از یک دیرکتوری خارج از دایرکتوری home/greg به فایل foo.txt دسترسی پیدا کنیم باید نام دایرکتوری + جداکننده (/) + نام فایل را وارد کنیم. Home/greg/foo.txt . این قانون اصلی namespace در دنیای برنامه نویسی است.
این قابلیت برای این طراحی شده که 2 مشکل نویسندگان کتابخانه ها و برنامه های کاربردی را حل کند:
1. جلوگیری از name collision ( جلوگیری از نامگذاری مشابه برای توابع یا کلاسها یی که ایجاد کرده اید با کلاسها و توابع داخلی php)
2. کوتاه کردن نامهای طولانی که برای کلاسها ایجاد کرده اید برای خوانایی بهتر کد.
اين طرح مانع از آن می شود تا کلاس هايی که برای متدها و خصوصيات از يک شناسه يکسان استفاده می کنند تداخل داشته باشند.
.
.
و…


<?php
namespace myname; // see "Defining Namespaces" section


class MyClass {}
function myfunction() {}
const MYCONST = 1;

$a = new MyClass;
$c = new mynameMyClass; // see "Global Space" section


$a = strlen('hi'); // see "Using namespaces: fallback to global

// function/constant" section


$d = namespaceMYCONST; // see "namespace operator and __NAMESPACE__

// constant" section

$d = __NAMESPACE__ . '\MYCONST';
echo constant($d); // see "Namespaces and dynamic language features" section

?>


namespace ها از php 5.3.0 به بعد قابل دسترس هستند.

(منبع : http://wiki.iranphp.org/Namespaces_overview که ترجمه http://ir.php.net/manual/en/language….rationale.php است )

در حقیقت namespace ها مثل فولدر های هستند که . شما کد ها رو
در اونا قرار میدین .

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

___________________________

تعریف namespace

هر برنامه معتبری می توانید در namespace ها باشد
شما فقط می توانید توابع (function) , کلاس ها و ثابت ها(constants) را در namespace قرار بدین .
برای تعریف یک namespace شما باید از کلید “namespace” به همرا نام مورد نظر استفاده کنید
namepsace تعریف شده باید قبل از هر کدی باشد مگر یک استثنا که اونم فقط و فقط دستور Declare است



<?php
namespace MyProject;

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

?>


همون طور که میبینید . کلید “namespace” به همراه نامش یعنی “MyProject” ساخته شده.
توجه داشته باشید که قبل از namespace . هیچ کدی نباید وجود داشته باشد (غیر از استثنایی که در بالا گفتم )
و به سمت مرورگر ارسال شود برای مثال کد زیر .


<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script

?>
.
باعث یک fatal Error می شود .

لینک مربوط : http://ir.php.net/manual/en/language…definition.php

mtnam1372
سه شنبه 29 مرداد 1392, 12:32 عصر
زیر namespace ها (sub-namespaces)

شما می توانید چندید namespace را به صورت فرزند هم درست کنید
(مانند چندین فولدر که در هم هستند ) از اونجا که ساختار namespace ها مانند
ساختار folder ها هست . برای تعریف سه عدد namespace به صورت زیر عمل کنید .

کد:
namespace MyProject\Sub\Level
در کد بالا Sub به عنوان زیر namespace
MyProject در نظر گرفته میشود و . Level به عنوان زیر namespace
Sub در نظر گرفته می شود . دقیق مثل . ساختار فولدر ها .
یعنی مثل اینکه شما یک فولدر با نام MyProject درست کردید . و در اون هم یک فولدر به اسم Sub بسازید
سپس در فولدر Sub یک فولدر به نام Leve بسازید . البته با این تفاوت که شما در فولدر ها . فایل نگهر می دارید
ولی در namespace شما . توابع,کلاسها و ثابت ها رو نگهر می دارید . به همین سادگی !

لینک مربوط : http://ir.php.net/manual/en/language…ces.nested.php

__________________________

تعریف چندین namespace در یک پرونده



برای ساخت چندین namespace در یک فایل php
که مثال آن در سیستم فولدر ها می شود ساخت چندین فولدر در یک فولدر
باید به صورت زیر عمل کنید


<?php
namespace MyProject;

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

namespace AnotherProject;

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




در کد بالا . دو عدد namespace وجود دارد یکی MyProject و بعدی AnotherProject
این روش برای تعریف چندین namespace در یک فایل php مناسب . نیست
و فقط برای یک namespace مناسب است
برای تعریف چند namespace در یک فایل بهتر است از براکت استفاده کنید
مانند کد زیر





<?php
namespace MyProject {

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

namespace AnotherProject {

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







که باید جدی گرفته شود
توجه داشته باشید که اگر از براکت استفاده کنید . هیچ کدی در فایل (به غیر از Declare)
نباید از براکت ها خارج شوند
در این صورت باید کد های که تصمیم دارین در ریشه باشند رو در namespace سراسری قرار بدین
برای تعریف namespace سراسری (global namespace) که در ادامه کامل توضیح داده می شود
باید از . از کلید “namespace” و حتما بعد از آن براکت استفاده کنید
به شکل زیر





<pre dir="ltr"><?php
namespace MyProject {

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

namespace { // global code

session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?></pre>
<pre dir="ltr">




http://ir.php.net/manual/en/language...onmultiple.php

mtnam1372
سه شنبه 29 مرداد 1392, 12:37 عصر
استفاده از namespace



خب . تا اینجا تا حدود زیادی با namespace ها آشنا شدید . همون طور که گفتم شما فقط می توانید
کلاس , تابع , ثابت رو در namespace قرار بدهید ما . در مثال زیر یک namespace با نام test1 درست کردیم
و چندین تابع , ثابت و کلاس رو در اون قرار دادیم



<pre dir="ltr"><?php
namespace Test1{
class class1{

}

function Function1(){

}

const constants1 = 'hello';
}</pre>
<pre dir="ltr">





namespace ها از php 5.3.0 به بعد قابل دسترس هستند.

(منبع : http://wiki.iranphp.org/Namespaces_overview که ترجمه http://ir.php.net/manual/en/language….rationale.php است )

در حقیقت namespace ها مثل فولدر های هستند که . شما کد ها رو
در اونا قرار میدین .

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

ادامه دارد