PHP কোডিং স্টাইল গাইড

বর্তমানে php নিয়ে প্রচুর কাজ হচ্ছে, অসংখ্য library, framework আর component তৈরি হয়েছে। অনেক সময়ই একজন ডেভেলপার এসব মিলিয়ে একটি প্রোজেক্ট তৈরি করেন। তাই বিভিন্ন library, framework আর component এ একই ধরনের কোডিং স্টাইল অনুসরণ করলে এগুলো একত্রে ব্যবহার করা খুব সোজা হয়ে যায়।

The Framework Interop Group বেশ কিছু কোডিং স্টাইল প্রস্তবনা এবং অনুমোদন করেছে, যা PSR (PHP Standards Recommendations) নামে পরিচিত, এর মধ্য উল্লেখযোগ্য হলঃ PSR-1, PSR-2 এবং PSR-4 । বর্তমানে এই লেখার সময় (জুন ২০১৯) PSR আছে ১৯ টি, যার মধ্যে PSR-0 (Autoloading Standard) অচল হয়ে গিয়েছে ২০১৪ সালে, এর পরিবর্তে PSR-4 ব্যবহার করা উচিত; PSR-8, PSR-9 এবং PSR-10 বাতিল হয়েছে, PSR-5, PSR-19 ড্রাফট বা খসড়া হিসেবে আছে, PSR-12 পর্যালোচনা করা হচ্ছে। অর্থাৎ গ্রহণযোগ্য PSR ১৩ টি।

Image result for psr php

পরিচিত যে কোন কোডিং স্টাইল (PSR, PEAR অথবা Zend) অনুসরণ করলে অন্য ডেভেলপারের পক্ষে কোড পড়ে, নতুন করে কাজ করতে সুবিধা হয় এবং কোডও সামঞ্জস্যপূর্ণ হয়। ইতিমধ্যে Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium এর মত প্রোজেক্ট PSR অনুসরণ করা শুরু করেছে। আমরা এখানে PSR-1, PSR-2 এবং PSR-4 নিয়ে আলোচনা করব।

PSR-1: Basic Coding Standard

  1. ফাইলে শুধুমাত্র এবং ট্যাগ থাকবে।
  2. ফাইলে Byte Order Mark (BOM) বাদে শুধুমাত্র UTF-8 characters থাকবে।
  3. ফাইলে হয় symbols (classes, functions, constants, ইত্যাদি) declare করা উচিত, নয়ত অন্যান্য কাজ করবে (যেমনঃ আউটপুট করা, .ini সেটিংস পরিবর্তন, বা ব্যবহার, বাইরের কোন এক্টারনাল সার্ভিসের সাথে কানেক্ট করা, errors বা exceptions দেখানো, global বা static variable পরিবর্তন করা, ফাইল থেকে read বা write করা, ইত্যাদি) এমন কোড থাকা উচিত, কিন্তু দুটো একসাথে নয়।
  4. Namespace এবং class অবশ্যই একটি “autoloading” PSR (PSR-0 বা PSR-4) অনুসরণ করবে।
  5. Class এর নাম হবে, অর্থাৎ মাঝে space বা _ (underscore) থাকবে না এবং প্রতি শব্দের প্রথম অক্ষর হবে বড় হাতের, বাকিগুলো ছোট হাতের।
  6. Class constants এর প্রতি অক্ষর অবশ্যই বড় হাতের হবে অর্থাৎ , একাধিক শব্দ থাকলে সেগুলো _ (underscore) দ্বারা পৃথক হবে।
  7. Method এর নাম হবে, অর্থাৎ প্রথম শব্দ ছাড়া বাকি সব শব্দের প্রথম অক্ষর হবে বড় হাতের, বাকিগুলো ছোট হাতের।

PSR-2: Coding Style Guide

  1. কোড অবশ্যই একটি কোডিং স্টাইল গাইড অনুসরণ করবে (যেমনঃ PSR-1)। সব ফাইল লাইনের শেষ হবে Unix LF (linefeed) দিয়ে; ফাইলের শেষে একটি ফাঁকা লাইন থাকবে এবং একদম শেষে থাকলে তা বাদ দিতে হবে।
  2. Indenting এর জন্য Tab এর বদলে ৪টি space ব্যবহার করতে হবে। একটি লাইনের একদম শেষে whitespaces থাকবে না। প্রতি লাইনে সর্বোচ্চ একটি করে statement থাকবে। PHP keywords এবং constants , , আর হবে lowercase।
  3. লাইনের দৈর্ঘ্যে কড়াকড়ি নেই, তবে অবশ্যই ১২০ অক্ষরের বেশি হওয়া উচিত না, ৮০ টির নিচে হলে ভাল হয়।
  4. প্রতি declaration এরপর একটি ফাঁকা লাইন আর সবগুলো declaration এর পর একটি ফাঁকা লাইন থাকবে। থাকলে তা বসবে declaration এর পরে এবং প্রতি লাইনে একটি করে।
  5. Class এর শুরু ব্রাকেট অবশ্যই class নামের পরবর্তী লাইনে হবে, শেষ ব্রাকেট হবে এর কোড শেষ হবার পরবর্তী লাইনে। যদি থাকে, তাহলে এবং keyword class নামের সাথে একই লাইনে থাকবে, তবে একাধিক হলে আলাদা আলদা লাইনে একবার indentation করে বসতে পারবে। ব্যবহার করা যাবে না, প্রতি statement এ একটি করে property declare করা উচিত এবং নামের শুরুতে মাত্র ১টি _ (underscore) দেয়া যাবে না।
  6. Method এর শুরু ব্রাকেট অবশ্যই method নামের পরবর্তী লাইনে হবে, শেষ ব্রাকেট হবে এর কোড শেষ হবার পরবর্তী লাইনে। নামের শুরুতে মাত্র ১টি _ (underscore) দেয়া যাবে না। Arguments গুলোর প্রত্যেকটির পরে কমা দিয়ে তারপর একটি space হবে, কমার আগে কোন space হবে না। Default মান যুক্ত arguments সবার শেষে বসবে। Arguments আলাদা লাইনে বসতে পারে, তবে সেক্ষেত্রে প্রতি লাইনে ১টি এবং বন্ধ প্রথম ব্রাকেট পরের লাইনে বসবে। Method কল করার সময় arguments ব্রাকেটের শুরুর পরে ও শেষের আগে কোন space হবে না।
  7. সব property এবং method এর visibility (, এবং ) উল্লেখ করতে হবে; আর , visibility-র আগে এবং অবশ্যই visibility-র পরে বসবে।
  8. Control structure কীওয়ার্ডের পর অবশ্যই একটি space হবে, method আর function এর ক্ষেত্রে হবে না।
  9. Control structure এর body শুরুর ব্রাকেট condition এর সাথে একই লাইনে হবে, শেষের ব্রাকেট হবে body শেষ হবার পরবর্তী লাইনে।
  10. Control structure এর condition ব্রাকেট শুরুর পরে ও শেষের আগে কোন space হবে না, শেষের পরে একটি space হবে। Structure body একবার indent করতে হবে।
<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}

final public static function bar()
{
// method body
}
}

PSR-4: Autoloader

অফিসিয়াল ওয়েবসাইটের ভাষ্যঃ

This PSR describes a specification for autoloading classes from file paths. It is fully interoperable, and can be used in addition to any other autoloading specification, including PSR-0. This PSR also describes where to place files that will be autoloaded according to the specification.

  1. “Class” শব্দ দ্বারা classes, interfaces, traits, এবং একইরকম অন্যান্য structure কে বুঝানো হবে।
  2. একটি পূর্ণাঙ্গ গ্রহণযোগ্য class এর নাম হবে এরকমঃ

    i) একটি top-level namespace এর নাম থাকবে, যা “vendor namespace” নামেও পরিচিত।
    ii) এক বা একাধিক sub-namespace নাম থাকতে পারে।
    iii) একটি terminating class নাম, অর্থাৎ নিজস্ব নাম থাকবে।
    iv) নামে underscores থাকা, আলাদা কোন গুরুত্ব বহন করবে না।
    v) নামে যেকোন combination এর lower case এবং upper case অক্ষর থাকতে পারে।
    vi) সব class নাম অবশ্যই case-sensitive ভাবে নির্দেশ করতে হবে।
  3. একটি পূর্ণাঙ্গ গ্রহণযোগ্য class থাকা ফাইল লোড করার ক্ষেত্রেঃ
    i) সর্বপ্রথমের namespace separator বাদে ধারাবাহিকভাবে থাকা এক বা একাধিক namespace এবং sub-namespace নাম ( “namespace prefix”) মিলে অন্তত একটি “base directory” নির্দেশ করবে।
    ii) এই “namespace prefix” এর পরের বাদবাকি sub-namespace এর নাম base directory এর ভেতরে একই নামের (case একই) sub-directory নির্দেশ করবে। Namespace separators দ্বারা নির্দেশ করা হবে directory separators।
    iii) Terminating class নাম (case একই) দ্বারা দিয়ে শেষ হয়েছে এমন ফাইল নির্দেশ করা হবে।
  4. Autoloader প্রয়োগকালে কোন exceptions throw করতে পারবে না, কোন প্রকারের error দেখাবে না এবং কোন মান return করবে না।
একটি পূর্ণাঙ্গ গ্রহণযোগ্য class নাম, namespace prefix এবং base directory থেকে সংশ্লিষ্ট ফাইলের path ।

PSR-4 এর Meta Document সংক্রান্ত বিস্তারিত এখানে

Tools:

PHP_CodeSniffer দিয়ে উপরোল্লিখিত যেকোন recommendation এর সাথে কোড চেক করা যায়, আবার Sublime Text এর মত text editor গুলোয় প্লাগিন যুক্ত করে তাৎক্ষনিক ফলাফল পাওয়া যায়।

কোডের লে-আউটে সমস্যা থাকলে এই দুটো টুলস ব্যবহার করা যায়ঃ

Shell থেকে phpcs ম্যানুয়ালি run করা যায়ঃ

এটি error দেখাবার পাশাপাশি কীভাবে ঠিক করতে হবে, তা-ও বলে দেয়। Git hook এ এই কমান্ড যুক্ত করে দিলে নির্দিষ্ট standard এর কোড সঠিক না করা পর্যন্ত repository তে প্রবেশ করবে না।

PHP_CodeSniffer দিয়ে লে-আউটের সমস্যা automatically ঠিক করাঃ

PHP Coding Standards Fixer দিয়ে লে-আউটের সমস্যা ঠিক করার আগের error গুলোর তালিকা বের করাঃ

এছাড়া, পরিষ্কার ও সুন্দর PHP লেখার জন্য দেখা যেতে পারে Clean Code PHP

সবাই ভাল থাকুন!!

The Invisible Man | Machine Learning Engineer, Programmer, Tech Enthusiast

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store