سری استانداردهای PSR
تاریخچه مختصر
پی اچ پی در زمان تولید و ساختش هیچ الگو و استانداردی برای نوشتن کد ها نداشت . افرادی که با پی اچ پی کار میکردن نصف وقت خودشونو برای در آوردن نام با سلیقه خودشون میگذروندن و افراد و توسعه دهنده های دیگه وقتی کد های توسعه دهنده های قبلی رو به ارث میبردن فقط آشفتگی میدیدن . در همین حال بعضی از توسعه دهنده ها تصمیم میگیرن که یک استاندارد که خیلی خوب مستند شده رو تهیه کنن و در اختیار توسعه دهنده قرار بدهند .
psr-0 : استاندارد سازی autoloader
این استاندارد بزرگترین گام که برداشته شده یاد میشه . در این استاندارد از استفاده بی مورد include و require برای لود کردن کد های سر آمد در فایل های پی اچ پی خود داری میشود چرا که باعث آشفتگی کدهای شما میشود . در نسخه 5 پی اچ پی با معرفی کردن تابع جادویی __autoload() تحول اساسی برای استفاده مناسب از کد های سرآمد داشت . ولی در نسخه 5.1 پی اچ پی با اضافه شدن تابع spl_autoload به ما اجازه میدهد با spl_autoload_register زنجیره ای از کلاس ها و متدها رو ثبت کنیم .
شاید از خودتون سوال کنید اصلا این چیز ها چه استفاده ای دارد ؟! همونطور که سیستم ها بر چهارچوب mvc و فریم ورک های بزرگی مثل کدایگنایتر و لاراول رو مشاهده میکنیم در این سیستم ها قبل از use کردن یک کلاس به هیچ عنوان عبارت include و require مشاهده نمیشود ما تنها با مسیریابی namespace به کلاس دسترسی پیدا میکنیم دلیل این است که در ابتدای اجرا برنامه autoload این کلاس ها رو به برنامه ما ریجیستر کرده است .
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
spl_autoload_register('autoload');
psr-1 : استاندارد کد نویسی
در این استاندارد ما فقط به کد نویسی متمرکز میشویم . بعد از psr-0 در FIG فعالیت برای ساخت مدل جدید استاندارد سازی صورت گرفت در این استاندارد تمام تمرکز به نحوه پایه نوشتن یک فایل پی اچ پی تمرکز دارد و چه استاندارد های برای ساخت باید رعایت شود . مانند :
- ما باید از اصل PSR-0 پیروی کنیم
- ما باید تنها از تگ
- یک فایل PHP حتما باید در بوم UTF-8 ساخته شود .
- اجزای اصلی برنامه باید از هم جدا شوند ( ویو ها , ارتباط با دیتا بیس ها و صفحات پردازش اطلاعات , ... )
- نام کلاس های باید به صورت CamelCase باشد .
- ثابت در کلاس ها باید با حروف بزرگ و با underscore (_) از هم جدا شود
- و نام متد کلاس ها باید به صورت snackCase باشد .
این قوانین همه برای آن است که تمام فایل ها برای آن است که هر شخص به دلخواه خود نامگذاری نکند اگر هر کس به دلخواه خودش نامگذاری میکرد چه ظلمی به توسعه دهنده بعدی میشد
psr-2 : استاندارد سبک کد نویسی
هدف اصلی این استاندارد این است که سبک کد نویسی ما کاملا هدف مند باشد و از یک چهارچوب اساسی و مهم پیروی کنیم وقتی به قوانین psr-2 نگاه میکنیم میبینیم که قوانین در psr-1 رو گسترش داده و بنیاد کد نویسی ما در یک پروژه رو هدف قرار میدهد به طور خلاصه این سبک به این گونه میباشد :
- کدهای ما باید از چهارچوب psr-2 پیروی کنند
- ایندنت گذاری (تورفتگی ها) در برنامه رعایت شود ( در این قانون به جای تب باید حتما از 4 space استفاده شود )
- هر خط کد نباید طولانی شود , هر خط باید کمتر 80 کاراکتر داشته باشد و هر صفحه معمولا در حد نرمال باید 120 خط باشد
- بعد از استفاده از namespace باید یک خط خالی بعدش استفاده شود .و بعد از استفاده از use ها یک خط خالی بعدش استفاده شود
- قرار گیری براکت ها برای کلاس ها و متدها باید رعایت شود ( یعنی برای شروع کلاس براکت باز در یک خط و بعد از بدنه کلاس براکت بسته در خط بعد قرار گیرد )
- تمام کلمات از پیش تعیین شده و حتی بولین و نال به صورت کوچک یا همون lowerCase نوشته شود
- اگر در یک کلاس از مولتیپ ایمپلمنت استفاده شده باید هر کلاس انتزاعی در یک خط جدید فراخوانده شود
psr-3 : استاندارد لاگ کردن
نکتهای که باید اینجا بگم اینه که Interface در عنوان هر استاندارد به معنی مجموعه کدی در قالب یک پکیج است که به پروژه اضافه میشه و اون رو یکدست میکنه. به صورت خلاصه میتوان گفت که برای مرتب کردن نحوه لاگ کردن هستش که در قالب ۸ متد:
- debug
- info
- notice
- warning
- error
- critical
- alert
- emergency
مطرح شده است. با این روش لاگ گرفتن ها و یا ثبت اطلاعات در فایل لاگ پروژه مرتب خواهد شد و از قانون استانداردی تبعیت خواهد کرد.
psr-4 : استاندارد autoloader :
این استاندراد یک مشخصه از مسیر یک فایل را توصیف میکند .
- میتوان برای تمام که ساختار یک کلاس را دارند استفاده شود ( مثل تریت , اینتر فیس , کلاس و ... )
- معمولا از قاعده کلی زیر پیروی میکند :
\NamespaceName(\SubNamespaceNames)*\ClassName
- در این ساختار ما یک پوشه اصلی داریم که به آن namespace vendor یا بالاترین پوشه میگویند و تمام پوشه های برنامه در آن ساخته میشود ( مثلا در لاراول پوشه app رو داریم )
- در قسمت SubNamespaceNames میشود از یک پوشه استفاده شود یا بیشتر ( بسته به نیاز )
- در قسمت ClassName ما فقط نام کلاس رو داریم