این مقاله در ادامه مقاله قبلی با عنوان استاندارد برنامه نویسی کنیم (مقدمه) می‌باشد. در این مقاله میخواهیم نگاه موشکافانه تری به PSR-1 داشته باشیم. خیلی خوب تا اینجا مساله ای مطرح شد که چگونه برنامه‌ای بنویسیم که دیگران هم بتونن اون رو به راحتی بخونن و در کنار هم تیمی های ما ماژول ها، کلاس‌ها و متد های ما کار کنند. پس از بررسی کارهایی که در دنیا انجام شده متوجه شدیم که این مساله خیلی از برنامه نویسان بوده در همین رابطه استانداردهایی در دنیا درست شده است که برنامه نویسان مختلف میتونن با خوندن اون راحت‌تر و بهتر برنامه نویسی کنند. برای زبان PHP این استاندارد ها با نام PSR مطرح شده‌اند که در مقاله قبلی به معرفی آن‌ها پرداختیم و در اینجا میخواهیم وارد جزئیات بیشتر آن‌ها شویم.

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 میپردازیم که به نحوه پیاده‌سازی مربوط هستش.