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

Bedouin
5 min readJun 6, 2019

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

PSR-2: Coding Style Guide

  1. কোড অবশ্যই একটি কোডিং স্টাইল গাইড অনুসরণ করবে (যেমনঃ PSR-1)। সব ফাইল লাইনের শেষ হবে Unix LF (linefeed) দিয়ে; ফাইলের শেষে একটি ফাঁকা লাইন থাকবে এবং একদম শেষে ?> থাকলে তা বাদ দিতে হবে।
  2. Indenting এর জন্য Tab এর বদলে ৪টি space ব্যবহার করতে হবে। একটি লাইনের একদম শেষে whitespaces থাকবে না। প্রতি লাইনে সর্বোচ্চ একটি করে statement থাকবে। PHP keywords এবং constants true, false, আর null হবে lowercase।
  3. লাইনের দৈর্ঘ্যে কড়াকড়ি নেই, তবে অবশ্যই ১২০ অক্ষরের বেশি হওয়া উচিত না, ৮০ টির নিচে হলে ভাল হয়।
  4. প্রতি namespace declaration এরপর একটি ফাঁকা লাইন আর সবগুলো use declaration এর পর একটি ফাঁকা লাইন থাকবে। use থাকলে তা বসবে namespace declaration এর পরে এবং প্রতি লাইনে একটি করে।
  5. Class এর শুরু ব্রাকেট অবশ্যই class নামের পরবর্তী লাইনে হবে, শেষ ব্রাকেট হবে এর কোড শেষ হবার পরবর্তী লাইনে। যদি থাকে, তাহলে extends এবং implements keyword class নামের সাথে একই লাইনে থাকবে, তবে implements একাধিক হলে আলাদা আলদা লাইনে একবার indentation করে বসতে পারবে। var ব্যবহার করা যাবে না, প্রতি statement এ একটি করে property declare করা উচিত এবং নামের শুরুতে মাত্র ১টি _ (underscore) দেয়া যাবে না।
  6. Method এর শুরু ব্রাকেট অবশ্যই method নামের পরবর্তী লাইনে হবে, শেষ ব্রাকেট হবে এর কোড শেষ হবার পরবর্তী লাইনে। নামের শুরুতে মাত্র ১টি _ (underscore) দেয়া যাবে না। Arguments গুলোর প্রত্যেকটির পরে কমা দিয়ে তারপর একটি space হবে, কমার আগে কোন space হবে না। Default মান যুক্ত arguments সবার শেষে বসবে। Arguments আলাদা লাইনে বসতে পারে, তবে সেক্ষেত্রে প্রতি লাইনে ১টি এবং বন্ধ প্রথম ব্রাকেট পরের লাইনে বসবে। Method কল করার সময় arguments ব্রাকেটের শুরুর পরে ও শেষের আগে কোন space হবে না।
  7. সব property এবং method এর visibility (public, private এবং protected ) উল্লেখ করতে হবে; abstract আর final, visibility-র আগে এবং static অবশ্যই 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 এর নাম হবে এরকমঃ
    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    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 একই) দ্বারা .php দিয়ে শেষ হয়েছে এমন ফাইল নির্দেশ করা হবে।
  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 করা যায়ঃ
phpcs -sw --standard=PSR2 file.php

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

PHP_CodeSniffer দিয়ে লে-আউটের সমস্যা automatically ঠিক করাঃ
phpcbf -w --standard=PSR2 file.php

PHP Coding Standards Fixer দিয়ে লে-আউটের সমস্যা ঠিক করার আগের error গুলোর তালিকা বের করাঃ
php-cs-fixer fix -v --level=psr2 file.php

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

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

--

--

Bedouin

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