• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Namespaces در پی اچ پی
#1
لطفا کاربرد این Namespaces چی هست، کجا ها کاربرد داره(در نسحه جدید)
http://php.net/namespaces
یک توضیح کامل ممنون
  پاسخ
تشکر شده توسط : cyletech
#2
خوب من سعي مي‌كنم اين رو كمي توضيح بدم اما اين تنها گزينه جديد در php نيست و بهتره تا ورود php نسخه 6 از اون استفاده نكنيم فقط سعي كنيد اين دانش رو كسب كنيد و براي آينده به اون تسلط پيدا كنيد.
ببينين يكي از مشكلاتي كه با بزگتر شدن پروژه ها باهاشون برخورد مي كرديم اين بود كه برخي از كدها در قالب كلاس/توابع و يا ثابت ها اسامي داشتند كه ما آنها را فراموش مي‌كرديم و در طول پروژه ممكن بود از يك نام دوبار استفاده مي‌شد كه مشكلات زيادي به همراه داشت براي حل اين مشكل نام‌ها به تدريج بزرگ و بزرگتر مي‌شدن بطور مثال ممكن بود نام يك تابع از سي كاراكتر هم بيشتر شود كه اين خوانايي كد رو پائين مي‌آورد در برنامه نويسي شي گرا اين مشكل چيز جديدي نيست و براي حل اون از فضاي نام استفاده مي‌شه در php نسخه 5.3 نيز اين گزينه افزوده شد در واقع در اين نسخه ما با تعريف رابطه‌اي گروهي نام كلاس‌ها/توابع/ثابت‌ها را به يك scope خاص محدود مي‌كنيم.
براي تعريف فضاي نام بجز در مورد ساختارهاي declare كه اتفاقا يك گزينه جديد در php 5.3 به آن اضافه شده در بقيه موارد حتما بايد در ابتداي كد اين كار صورت گيرد و هيچ كدي اعم از php وغير نبايد پيش از آن وجود داشته باشد
کد پی‌اچ‌پی:
<?php
namespace MyProject;

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

?>
در اينجا نام فضاي نام ما فقط MyProject اما فضاي نام‌ها از اسامي سلسله مراتبي نيز پشتيباني مي كنند به اين شكل MyProject\Sub\Level خوب تحت اين شرايط كد بالا به ترتيب ثابتي با نام MyProject\Sub\Level\CONNECT_OK كلاسي با نام MyProject\Sub\Level\Connection و تابعي با نام MyProject\Sub\Level\connect ايجاد مي‌كند.
خوب حالا اين مسئله نيز مطرح مي‌شود كه آيا مي‌توان چند فضاي نام در يك فايل داشت پاسخ مثبت است كه در مثال‌هاي زير مشاهده مي‌گردد:
کد پی‌اچ‌پی:
<?php
namespace MyProject;

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

namespace 
AnotherProject;

const 
CONNECT_OK 1;
class 
Connection /* ... */ }
function 
connect() { /* ... */  }
?>
روش ديگري براي داشتن چند فضاي نام
کد پی‌اچ‌پی:
<?php
namespace MyProject {

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

namespace 
AnotherProject {

const 
CONNECT_OK 1;
class 
Connection /* ... */ }
function 
connect() { /* ... */  }
}
?>
نكته: استفاده از چند فضاي نام در يك فايل به هيچ عنوان پيشنهاد نمي‌شود.
حال مشكلي كه مطرح مي‌شود استفاده از توابع و كلاس‌هاي پيشين در چنين كدهايي است كه ما به آنها سراسري ها مي گوييم براي دست‌يابي به مواردي اينچنيني فقط روش براكت دار قابل استفاده است.
کد پی‌اچ‌پی:
<?php
namespace MyProject {

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

namespace { 
// global code
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>
قبلا گفته بودم كه يك استثنا در مورد كدهاي مجاز پيش از فضاي نام وجود دارد و اين هم گزينه جديدي كه به آن در اين نسخه اضافه شده.
کد پی‌اچ‌پی:
<?php
declare(encoding='UTF-8');
namespace 
MyProject {

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

namespace { 
// global code
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>
خوب حالا مي‌خواهيم روش استفاده از اين تكنيك را بياموزيم بهترين مثال براي فضاي نام خود سيستم عامل است ما در حالت كلي به سه طريق توسط سيستم عامل به فايل هاي مورد علاقه خود دسترسي پيدا مي‌كنيم.
1- با ذكر نام فايل file.txt كه اين عمل توسط سيستم عامل بصورت currentdirectory/file.txt برداشت مي‌شود بطور مثال نتيجه نهايي بصورت home/currentdirectory/file.txt خواهد بود
2-با ذكر زير شاخه و نام مثل subdirectory/file.txt كه نتيجه نهايي بصورت home/currentdirectory/subdirectory/file.txt خواهد بود
3-باذكر مسير دقيق مثل main/file.txt
در php درست با همين سه حالت روبرو هستيم
1-
کد پی‌اچ‌پی:
$a = new foo(); or foo::staticmethod(); 
اگر فضاي نام جاري currentnamespace باشد بصورت زير تعبير مي‌شود
کد پی‌اچ‌پی:
currentnamespace\foo 
و اگر كد بصورت سراسري باشد كه طبيعي است از كلاسي با نام foo نمونه سازي خواهد شد
2-
کد پی‌اچ‌پی:
$a = new subnamespace\foo(); or subnamespace\foo::staticmethod(); 
كه مانند گذشته اگر فضاي نام جاري currentnamespace باشد بصورت زير تعبير مي‌شود
کد پی‌اچ‌پی:
currentnamespace\subnamespace\foo 
3-
کد پی‌اچ‌پی:
$a = new \currentnamespace\foo(); or \currentnamespace\foo::staticmethod(); 
كه فكر نمي كنم ديگر نياز به توضيح داشته باشه
نكته باقيمانده اين است كه جهت دسترسي به توابع سراسري از داخل يك فضاي نام كافيست به اين شكل عمل كنيم ()strlen\
ادامه مراحل استفاده و فراگيري را مي توانيد از روي تارنماي php دنبال كنيد
پ.ن: تمامي توابع و مثال‌ها برگرفته از مستندات php است
  پاسخ
#3
آقا ممنون و متشکر. واقعا خیلی مفید و جالب بود.
سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

[عکس: ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان