این مقاله در ادامه مقاله قبلی با عنوان استاندارد برنامه نویسی کنیم (مقدمه) میباشد.
در این مقاله میخواهیم نگاه موشکافانه تری به PSR-1
داشته باشیم.
خیلی خوب تا اینجا مساله ای مطرح شد که چگونه برنامهای بنویسیم که دیگران هم بتونن اون رو به راحتی بخونن و در کنار هم تیمی های ما ماژول ها، کلاسها و متد های ما کار کنند.
پس از بررسی کارهایی که در دنیا انجام شده متوجه شدیم که این مساله خیلی از برنامه نویسان بوده در همین رابطه استانداردهایی در دنیا درست شده است که برنامه نویسان مختلف میتونن با خوندن اون راحتتر و بهتر برنامه نویسی کنند.
برای زبان PHP
این استاندارد ها با نام PSR
مطرح شدهاند که در مقاله قبلی به معرفی آنها پرداختیم و در اینجا میخواهیم وارد جزئیات بیشتر آنها شویم.
PSR-1
این استاندارد شامل چندین بخش مختلف است که در ادامه به تفصیل هر کدام را توضیح خواهیم داد.
فایلها مجازند تنها تگ “<?php”
و “<?=”
رو داشته باشند.
به نظر بنده بزرگترین ویژگی PHP
این هستش که برنامه نویس در اون میتواند هر ملقی بزند بدون اینکه با خطایی برخورد کنند. مثلاً میشود ’1000’
رو به اون داد و با 1000
به صورت Integer
مقایسه کرد. در صورتی که اگر این کار را بخواهید با JAVA
بکنید میبینید که یک کافی با چوب از درون مانیتور درآمد و دنبال شما افتاد. یا اینکه میتونید به صورت استرینگ یک تابع خود را صدا بزنید. به مثال زیر دقت بفرمایید:
class MyClass
{
public function myFunc()
{
return null;
}
}
حالا فرض کنید متد بالا را میخواهیم صدا بزنید. خب جند روش وجود دارد. که من تک تک اونها رو مینوسم. روش اول
$object = new MyClass();
$object->myFunc();
روش دوم (فشرده)
(new MyClass())->myFunc();
روش سوم
$myFuncName = ‘myFunc’;
$object = new MyClass();
$object->{$myFuncName}();
جلل خالق در این روش نام فاکش رو به صورت یک متغیر استرینگ من گرفتم و اون رو اجرا کردم. خب این موضوع به چ دردی میخوره اینکه من میتونم نام فانکشن رو در دیتا بیس ذخیره کنم و در شرایط های خاص این امکان رو به مدیر پنل بدم که به صورت داینامیک فاکشن مورد نظرش رو صدا بزنه.
همچنین میتونیم در PHP
با استفاده از تگ <?=
که در بالا به اون اشاره شد متن مورد نظرمون رو echo
کنیم. خب این قابلیت به ما اجازه میده که وسط کدهامون یه تیکه از صفحه نهایی که به کاربر نشون داده میشه رو بسازیم.
خب حالا همه این قابلیتها رو فرض کنید که بخواهیم توی یک فایل بگونجونیم. چی میشه … بهبه عالی میشه.
خب برای اینکه این اتفاق نیوفته اومدن و چند تا کار رو با هم انجام دادن. یکی اینکه اول از همه گفتن یا کد php
یا خروجی برای UI.
برای کد نویسی باید از UTF-8 without BOM
استفاده شود.
همون طور که خیلی از ما ها میدونم فایلهای استرینگ با فرمت های مختلفی هستند که در اون همه زبانها گنجونده شدهاند ولی فرمت های زیادی برای اونها وجود داره. مثلاً اون رو باید شاید وقتی در گذشته وارد یک سایت فارسی میشدید و میدیدید که همه چیز به زبان انگولاساکسون نوشته شده. در اون زمان بود که اون یک چپ کلیک و انتخاب encoding و UTF-8 اون به زبان فارسی برمیگشت، دیده باشید. برای اینکه هر کسی فرمت خودش رو نداشته باشه قرار شد که همه از فرمت فوق استفاده کنند. این فرمت به ما کمک میکنه که بتونیم توی فایل هامون حتی فارسی هم بنویسیم اما قطعاً و حتماً نباید فارسی رو توی کد ها بنویسیم حتی به عنوان کامنت.
فایلها یا باید برای تعریف سیمبول ها(کلاس ها و متدها و ...) باشند یا برای side-effect ها (مثلاً فایلهای تنظیمات مثل setting)
در اینجا به یکی از بزرگترین نکات این استاندارد اشاره شده.
لطفاً کلاسها جدا ، تنظیمات کلاس جدا
این یعنی اینکه شروع کنیم فایلهای زیاد بسازیم و نترسیم از فایلهای زیاد ساختن بعد از این مرحله یاد گرفتیم که کلاً هر فایل برای یک کلاس باشه نه اینکه ۱۰ تا کلاس توی یک فایل باشد.
نام محیط (namespace)فایلها باید از یکی از استاندارد های PSR-0
(منسوخ شده) یا PSR-4
تبعیت کنند. برای اینکه به صورت اوتوماتیک در فایل php
لود شوند. لازم به ذکره که namespace
همون چیزی هستش که در بالای فایلها مینویستم که نشون بدیم این فایل مربوط به چه کسی و چه پکیجی هستش و در چ آدرسی قرار گرفته تا سیستم کامپوزر متوجه بشه و اونو اتوماتیک در پروژه require
کنه.
تمامی دوستانی که از فریم ورک استفاده میکنند میدونند که در پروژه ها پکیجی وجود داره به نام composer
، این پکیج، کارش آینه که پروژه رو در با استاندار PSR-4
کنترل کنه و کلاسها به صورت اتوماتیک در اون لود بشوند.
برای اینکه این موضوع رو بهتر متوجه بشیم به مثال زیر دقت بفرمایید.
فرض کنید بخواهیم یه فایل به نام index.php
و یک فایل دیگر که در اون یک کلاس به نام MyClass.php
که در بالا آورده شد، رو داشته باشیم. و نمای اونها در فولدر ما به شکل زیر باشه
app/
index.php
resource/
MyClass.php
در اینجا میخواهیم متد myFunc
رو در index.php
صدا بزنیم.
<?php
require_once('../resource/MyClass.php');
$object = new MyClass();
$object->myFunc();
?>
حالا فرض کنید پروژه شما از ۲۰۰ تا کلاس داشته باشه. باید ۲۰۰ بار require_once کرد. برای اینکه این اتفاق نیوفته پکیجی به نام کامپوزر طراحی شده کد ها از این شکل خارج شده. و تنها کافی هستش که آنها را با استفاده از namespace
که در فایل آنها نویشته میشود، use
کنیم.
چون این مبحث مربوط به PSR-4
است اجازه بدید که در آنجا توضیحات بیشتر بدم.
نام کلاسها باید به صورت StudlyCaps
نوشته بشوند. مثلاً اینجوری TestClass
تمامی constants
های یک کلاس باید به صورت حروف بزرگ و با خط فاصله underscore
جدا شوند. مثلاً DEFAULT_VALUE
همگی متد ها باید به صورت شتری :smile: (camelCase
) نوشته بشوند. مثلاً testFunction
خلاصه همگی موارد فوق رو در یک مثال توضیح میدیم.
<?php
namespace Resource;
class MyClass
{
/**
* This is version of this class
*/
const VERSION = '1.0';
/**
* This is date of approved of this
*/
const DATE_APPROVED = '2018-08-04';
/**
* @param int $inputValue
* @return int
*/
public function myFunc(int $inputValue)
{
if($inputValue>0){
return $inputValue;
}
return 0;
}
}
همون طور که دیده میشود نام کلاس به صورت StudyCaps
نوشته شده است. این یعنی اینکه حرف اول کلمات بزرگ شده و کلمات بدون فاصله پشت سر هم نوشته میشوند.
نام متد یا فانکشن ها، نام متغیر ها به صورت camelCase
نوشته شده اند. این یعنی اینکه دقیقاً مثل روش قبلی نوشته میشوند با این تفاوت که حرف اول کلمه اول باید کوچک باشد.
و همچین موارد ثابت مانند constants
ها باید به صورت under_score
و بزرگ نوشته بشوند مانند:
const VERSION = '1.0';
const DATE_APPROVED = '2018-08-04';
نکته ای که در اینجا میخوام بگم اینه که همون طور که میبینید قبل از متد و متغییرها یه چیزی وجود داره که با /**
شروع شده و با *
ادامه یافته و با */
تموم شده. اینها برای داکیومنتیش برنامه ای که مینویسیم هستن که در اینده بهتون یک پکیج رو معرفی میکنم که به صورت اوتوماتیک از تمام کدهای شما داکیومنت میسازد.
در مقاله بعدی به استاندارد PSR-2 میپردازیم که به نحوه پیادهسازی مربوط هستش.