همه چیز در مورد PSR (بخش اول)

یکی از مشکلاتی که اکثر ما برنامه‌نویس‌ها با اون مواجه شدیم، این بوده که وارد یک پروژه جدید شدیم و باید کلی زمان صرف آشنایی با روش کدنویسی برنامه نویس قبلی می‌کردیم.خیلی وقت‌ها هم شاید برای خودمون یه سری قاعده و قانون گذاشته باشیم اما هر سری وقتی عضو جدید به تیم اضافه شده، باز هم کلی وقت هدر رفته تا اون عضو جدید با استاندارد های ما آشنا بشه.باید بگم که یه سری برنامه‌نویس‌ داخل کنفرانس PHP-tek سال ۲۰۰۹ این قضیه خیلی اذیتشون کرد و به این نتیجه رسیدن که بیان و یه استاندارد کلی برای زبان PHP ارائه بدن تا همه از این استاندارد داخل کدهاشون استفاده کنند و با استفاده از این استاندارد، راحت تر بتونن با کدهای هم ارتباط بگیرن و درکش کنند. اسم این استاندارد هم گذاشتن PHP Standards Recommendations.من هم امروز و توی اولین پستم در ویرگول میخوام شروع کنم و این استاندارد‌ها رو معرفی کنم. باشد که رستگار شویم :)از سال ۲۰۰۹ تا امروز، ۲۲ تا استاندارد تعریف شده اما از این تعداد فقط ۱۳ تا درحال حاضر مورد استفاده قرار می‌گیره و بقیه‌ی اون‌ها یا هنوز کاملا تایید نشدن یا منقضی شدن و ... . (روال تایید شدن استانداردها هم یه راه و رسم خاصی داره که بعدا توی یه پست جدا توضیح میدم ایشالا)در ادامه با چندتا از این استاندارد‌های تایید شده آشنا می‌شیم.PSR-1: Basic Coding Standardدر این PSR، یه سری استاندارد‌های اولیه کدنویسی رو باهم قرارداد می‌کنیم.به صورت خلاصه این استاندارد موراد زیر رو بیان می‌کنه:فایل‌های php فقط باید از تگ `php?>` و `=?>` استفاده کنند.فایل‌های php فقط باید از UTF-8 استفاده کنند.فایل‌های php یا فقط باید چیزی را تعریف کنند (کلاس، تابع، ثابت و ...) یا side-effect ایجاد کنند اما نباید هر دو را انجام دهند. (در ادامه بیشتر در موردش توضیح میدم)نیم‌اسپیس‌ها و کلاس‌ها باید از یکی از استانداردهای autoloading استفاده کنند.(PSR-0,PSR-4) نام کلاس ها باید به صورت StudyCase باشد. (PascalCase)ثابت‌ها در کلاس باید تماما با حروف بزرگ نوشته شده و کلمات آن‌ها با آندرلاین از هم جدا شوند.متد‌ها باید به صورت camelCase تعریف شوند.مورد اول و دوم که نیازی به توضیح بیشتر ندارن. اما مورد سوم... !منظور از اینکه گفتیم باید چیزی رو تعریف کنند یعنی اینکه یه فایل بسازیم که داخلش کلاسمون رو تعریف کنیم و داخل اون فایل کار دیگه‌ای انجام ندیم. اما منظور از ساید افکت چیه؟تعریف اصلیش اینه:The phrase "side effects" means execution of logic not directly related to declaring classes, functions, constants, etc.همونطور که در بالا ذکر شده، منظور از ساید افکت، اجرای منطقیه که به صورت مستقیم ربطی به تعریف کلاس و تابع و ... نداره.یه مثال از فایلی که داخلش هم تعریف انجام شده و هم ساید افکت وجود داره این هستش:<?php // side effect: change ini settings ini_set('error_reporting', E_ALL); // side effect: loads a file include &quotfile.php&quot // side effect: generates output echo &quot<html>\n&quot // declaration function foo() { // function body }یه مثال هم از فایلی که فقط داخلش تعریف و چیزی که مستقیما به تعریف مربوطه این هستش:<?php // declaration function foo() { // function body } // conditional declaration is *not* a side effect if (! function_exists('bar')) { function bar() { // function body } }درمورد namespace ها هم این نکته رو باید بگم که اگر از php ورژن 5.2 به قبل استفاده می‌کنید هم نباید از نیم‌اسپیس‌ها غافل بشید و باید اونها رو به این شکل پیاده کنید.<?php // PHP 5.2.x and earlier: class Vendor_Model_Foo { }این مثال در نسخه های جدید php به صورت زیر پیاده‌سازی میشه.<?php // PHP 5.3 and later: namespace Vendor\Model; class Foo { }برای خالی نبودن عریضه یه مثال هم برای تعریف ثابت در کلاس ها می‌زنیم.اگر خواستیم داخل کلاسی ثابت تعریف کنیم، این کار رو به شکل زیر انجام میدیم.<?php namespace Vendor\Model; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; }و در انتها این نکته رو باید بگم که این استاندارد به صورت عمدی هیچ استانداردی برای تعریف property ها قرار نداده و فقط گفته که برای محدوده‌ی معقولی از کدهاتون، استاندارد‌های واحدی برای تعریف property ها داشته باشیم. همین و بس!خب دوستان این PSR دیگه نکته خاصی برای گفتن نداره و تموم شد. بقیه‌ی استاندارد‌ها رو هم ایشالا در پست‌های بعدی براتون قرار خواهم‌‌داد.