توی این مقاله میخوام درباره اولین تجربه خودم در حوزه برنامه نویسی php
که روی یک پروژه بزرگ کار میکردم باهاتون صحبت کنم.
اولین روزهایی که ما دوستان برنامه نویس با هم برنامه نویسی رو شروع کردیم خیلی مهم نبود که استاندارد های برنامه نویسی رو رعایت کنیم اما بعد از گذشت ۶ ماه این موضوع کم کم جدی شد. طوری که برای تغییر دادن یک بخش کوچک که به نظر میرسید کار یک روز باشه ما مجبور بودیم که چند روز و بعضی وقتها چند هفته وقت بگذاریم تا بتونیم اون کار رو انجام بدیم. لذا برنامهای جدی گذاشتیم تا در اولین فرصت کد های خودمون رو ریفکتور کنیم تا هم همکارانمون بتونن متوجه کدهایی که ما زدن بشن و برعکس و هم اینکه با تغییر دادن یک بخش، بخش دیگری کرش نکنه.
پس از اینکه جستجوی لازم رو برای استاندارد های موجود انجام دادیم که در ادامه میخواهم به یک به یک این استاندارد ها بپردازم.
خب اولین چیزی که متوجه شدیم این بود که باید اول کد زدنمون رو درست کنیم. این یعنی اینکه اسم کلاسها، سیمبول ها، پراپرتی ها، توابع و … رو باید درست بنویسیم. پس گشتیم و گشیتم تا به سایت https://www.php-fig.org برخورد کردیم.
در این سایت در بخش PSR
استاندارد هایی رو که مورد تأیید قرار گرفته شده رو برای عموم گذاشتن تا همه بتونن از تجربیات افراد متخصص استفاده کنن و یکدست کد بزنن.
وقتی وارد تب PSRs
بشید میبینید که تاکنون ۱۱ استاندارد Accept
شده و همچنین مقاله های بیشتری در حال بررسی هستند تا Accept
شوند و جزء استاندارد ها قرار بگیرند.همچنین مواردی هستند که رها شدهاند ABANDONED
و همچنین موردی هست که دیگه استفاده نمیشه DEPRECATED
چون که جای اون یه پکیج جدید وجود داره.
در ادامه موارد ۱ تا ۷ ام رو به طور اختصار توضیح میدم.(البته مواردی که Accept
هستند;
Basic Coding Standard
:PSR-1
Coding Style Guide
:PSR-2
Logger Interface
:PSR-3
Improved Autoloading
:PSR-4
Caching Interface
:PSR-6
HTTP Message Interfaces
:PSR-7
استاندارد PSR-1
به طور خلاصه باید بگم در این استاندارد به نحوه پیادهسازی کد ها در فایلها پرداخته شد و نام گذاری کلاسها و توابع و … پرداخته شد. که به صورت تیتروار موارد ذیل هستش
- فایلها مجازند تنها تگ
<?php
و<?=
رو داشته باشند. - برای کد نویسی باید از
UTF-8 without BOM
استفاده شود. - فایلها یا باید برای تعریف سیمبول ها(کلاس ها و متدها و ...) باشند یا برای
side-effect
ها (مثلاً فایلهای تنظیمات مثلsetting
- نام محیط
namespace
فایلها باید از یکی از استاندارد هایPSR-0
(منسوخ شده) یاPSR-4
تبعیت کنند. برای اینکه به صورت اوتوماتیک در فایلphp
لود شوند. لازم به ذکره کهnamespace
همون چیزی هستش که در بالای فایلها مینویستم که نشون بدیم این فایل مربوط به چه کسی و چه پکیجی هستش و در چ آدرسی قرار گرفته تا سیستم کامپوزر متوجه بشه و اونو اتوماتیک در پروژهrequire
کنه. - نام کلاسها باید به صورت
StudlyCaps
نوشته بشوند. مثلاً اینجوریTestClass
. - تمامی
constants
های یک کلاس باید به صورت حروف بزرگ و با خط فاصلهunderscore
جدا شوند. مثلاًDEFAULT_VALUE
- همگی متد ها باید به صورت شتری
camelCase
نوشته بشوند. مثلاًtestFunction
- نکته مهم اینه که برای متغیر ها هیچ خط مشی ای مشخص نشده لذا هر طور که خواستید بنویسید که البته من همیشه به صورت
camelCase
مینویسم ولی شما میتونید از روش خودتون استفاده کنید. ولی نکته بسیار بسیار مهم آینه که همه جا از یک روش استفاده کنید نه اینکه یه جاcamelCase
و یه جای دیگهunder_score
و یه جای دیگهStudyCap
بنویسید.
استاندارد PSR-2
این استاندارد در ادامه استاندارد قبلی است. و مواردی که در این استاندارد رعایت شود به صورت تیتر وار به قرار ذیل است:
- باید استاندارد
PSR-1
رعایت شود. - برای
indentation
باید ۴ اسپس زده شود.Indextion
همان فاصله هایی است که کدهای زیر یک تابع یا حلقه نسبت به خط بالاسری دارد. - هیچ محدودیت
hard limit
ای برای طول خط ها وجود ندارد. اماsoft limit
برای هر خط ۱۲۰ کاراکتر هستش. یعنی طول خطوط اگر بیشتر از ۱۲۰ تا شد باید اینتر بزنید و در خط پایینی ادامش بدید. - تنها یک خط خالی بعد از
namespace
ویک خط خالی بعد ازuse
ها باید باشد. curly bracket
بعد از کلاس و متد باید در یک خط باشد و در پایان هم همینطور.- برای تمام متد ها و پراپرتی ها باید
Visibility
مشخص شود. یعنی مثلاً مشخص شود کهpublic
هستش یاprivate
یا برای پراپرتی ها (متغیر های داخل کلاس که عمومی هستن)protected, abstract
و … - کنترل استراکچر ها یا همان
If
وswitch case
و … - باید بین شرط ها بعد از ویرگول یک اسپس زده شود.
- پرانتز شرط ها بدون فاصله به آنها میچسبد.
curly bracket
بازشونده در همان خط وcurly bracket
بسته شونده یک خط پایینتر از متن و در یک خط نوشته شود. - متنی که در هر شرط نوشته میشود باید بدون هیچ فاصلهای نسبت به خط بالایی نوشته شود.
چون در این بخش صرفاً میخوام همه چیز رو معرفی کنم در اینجا فقط توضیح مختصری داده شده که در مقالههای بعدی کاملاً با نمونه کد تشریح خواهم کرد.
استاندارد PSR-3
نکتهای که باید اینجا بگم اینه که Interface
در عنوان هر استاندارد به معنی مجموعه کدی در قالب یک پکیج است که به پروژه اضافه میشه و اون رو یکدست میکنه.
به صورت خلاصه میتوان گفت که برای مرتب کردن نحوه لاگ کردن هستش که در قالب ۸ متد:
debug
info
notice
warning
error
critical
alert
emergency
مطرح شده است. با این روش لاگ گرفتن ها و یا ثبت اطلاعات در فایل لاگ پروژه مرتب خواهد شد و از قانون استانداردی تبعیت خواهد کرد.
استاندارد PSR-4
همون چیزی هستش که به خاطر اون در پروژه هامون از Composer
استفاده میکنیم. اگه بخواهیم بدون استفاده از composer
یک پروژه را درست کنیم در فایل index.php
باید چند صد بار از require_once
استفاده کنیم. اما با این روش فایلها به صورت اوتوماتیک در پروژه لود میشوند و فقط کافی است که قبل از کلاسی که میخواهیم از آن استفاده کنیم اونها رو با namespace
مربوطه use
کنیم. مثال کامل و دقیق تر این استاندارد رو در یک مقاله کاملاً جدا خواهم نوشت تا دوستان به عمق composer
پی ببرند چون خودم هم مدتها نمیدونستم دقیقاً کار کامپوزر چی هستش.
استاندارد PSR-6
همون طور که از عنوان این استاندار پیداست این پیکیجی برای یک دست شدن دیتا ها در سیستم Cache
میباشد. در این پکیج برنامه نویسان میتوانند به صورت یکپارچه از سامانه Cache
استفاده کنند که در آن با استفاده از کلید و زمان انقضا متغیر مورد نظر خودشون بر روی هارد دیسک و یا رم ذخیره کنند.
استاندارد PSR-7
در این پکیج نیز استانداردی برای بیان کردن پیغام های HTTP
معرفی شد. تا قبل از این استاندارد با استفاده از متغیر هایی نظیر _SERVER
و یا _GET
پارامتر های ورودی ریکوئست را دریافت کرد. این پکیج شامل دو اینترفیس RequestInterface
و ResponseInterface
که به ترتیب برای دریافت پارامتر ها و برای ارسال پارامتر ها با استفاده از پروتکل HTTP Message
میباشد.