GORAGOD.com

Basic Coding Standard PSR-1

ใน PSR-1 จะกล่าวถึง กฏการใช้งานไฟล์ PHP และ กฏการตั้งชื่อคลาส ซึ่งจะมีทั้งสิ่งที่ต้องทำ สิ่งที่ควรจะทำ และสิ่งที่ควรหลีกเลี่ยง เพื่อให้โค้ดเป็นระเบียบ และ มีความเข้าใจที่สอดคล้องกันสำหรับนักพัฒนาแต่ละท่าน ซึ่งจะช่วยให้การตรวจสอบ ตลอดจนการพัฒนาต่อจากนักพัฒนาก่อนหน้าทำได้ง่ายขึ้น

ไฟล์

  1. ให้ใช้ <?php ?> สำหรับไฟล์ PHP เท่านั้น และสามารถใช้ <?= ?> แทน <?php echo ... ?> ได้

    ความเห็นผู้เขียน ส่วนตัวผมไม่แนะนำให้เขียน PHP สลับ HTML ผมแนะนำให้ใช้ PHP ล้วนหรือ HTML ล้วนมากกว่า ดังนั้นตลอดทั้งไฟล์จะมีเพียง <?php เพียงอันเดียวเท่านั้น โดยไม่ต้องมี ?> ปิดท้ายไฟล์ และไม่ต้องใช้ <?= ด้วย

  2. ไฟล์ PHP ต้องเป็น UTF-8 without BOM เท่านั้น
  3. หลีกเลี่ยงการใช้ชื่อฟังก์ชั่น ชื่อตัวแปร ชื่อคลาส หรืออื่นๆ ที่อาจมีผลข้างเคียง เช่นอาจมาทับตัวแปรหรือฟังก์ชั่นที่มีอยู่ก่อนแล้ว เช่น ตัวแปรหรือฟังก์ชั่นในคลาสหลัก ตลอดจนการแก้ไขค่าของตัวแปรระบบต่างๆของ PHP
ตัวอย่างคำสั่งที่อาจมีผลกระทบ หรืออาจมีผลข้างเคียงได้
<?php
// ผลข้างเคียงจากการแก้ไขค่าติดตั้งของ PHP บางคำสั่งอาจมีผลให้ Server ทำงานผิดปกติได้
ini_set('error_reporting', E_ALL);

// ผลข้างเคียงจาการ include file จากภายนอกอาจทำให้ค่าตัวแปรต่างๆมีการเปลี่ยนแปลง เช่น ถูกเปลี่ยนแปลงใน file.php
include "file.php";

// ผลข้างเคียงอันเกิดจาการแสดงผล เช่น การส่งออก output ก่อนการประกาศ session
echo "<html>\n";

// ผลค้างเขียงจากการประกาศฟังก์ชั่น ชื่อฟังก์ชั่นอาจซ้ำกันกับฟังก์ชั่นของ PHP หรือ ฟังก์ชั่นจาก คลาสหลัก
function foo()
{
    // function body
}

ตัวอย่างด้านบน เป็นเพียงข้อควรระวังเท่านั้นนะครับ ไม่ใช่ข้อห้ามแต่อย่างใด เพียงแต่ ควรใช้อย่างระมัดระวัง
สำหรับการป้องกันผลข้างเคียงจากการประกาศฟังก์ชั่น อาจใช้วิธีการทดสอบว่ามีฟังก์ชั่นอยู่ก่อนแล้วหรือไม่ ดังตัวอย่างด้านล่าง
// ตรวจสอบว่ามีฟังก์ชั่นหรือไม่ ก่อนการประกาศฟังก์ชั่นใหม่
if (!function_exists('foo')) {
    function foo()
    {
        // function body
    }
}

Namespace และ Classname

  1. ชื่อคลาสต้องปฎิบัติตาม PSR-4
  2. นั่นหมายความว่า คลาสจะต้องประกอบด้วย Namespaces อย่างน้อย 2 ระดับ คือ Vender\Namespaces\Classname (Vender หมายถึงเจ้าของคลาสหรือผู้เขียนคลาส)
  3. สำหรับ PHP เวอร์ชั่น 5.2 หรือต่ำกว่าจะไม่สามารถใช้ Namespaces ได้ ให้ใช้ _ เชื่อมระหว่าง Vender, Namespaces และ Classname แทน
  4. Classes ต้องถูกโหลดโดยอัตโนมัติเมื่อมีการเรียกใช้ (autoloading) ตามมาตรฐานของ PSR-4
  5. ชื่อคลาส ต้องสื่อความหมาย และอยู่ในรูปแบบ StudlyCaps (ขึ้นต้นด้วยตัวอักษรพิมพ์ใหญ่ในแต่ละคำ และต่อคำโดยไม่มีสัญลักษณ์ใดๆคั่น)
<?php
// ตั้งแต่ PHP 5.3 ขึ้นมา
namespace Vendor\Namespaces;

class ClassName
{
}

ถ้าเขียนในเวอร์ชัน 5.2.x หรือก่อนหน้า ใช้ _ เชื่อมระหว่าง Vender, Namespaces และชื่อคลาสแทน
<?php
// ตั้งแต่ PHP 5.2.x หรือก่อนหน้า
class Vendor_Namespaces_ClassName
{
}
 

ค่าคงที่, ตัวแปร, และ เมธอด

  1. ค่าคงที่ (Constants) ควรอยู่ในรูปแบบ ตัวอักษรตัวพิมพ์ใหญ่เท่านั้น คั่นแต่ละคำด้วย _ (ขีดเส้นใต้)
  2. ตัวแปร (Properties) ควรอยู่ในรูปแบบ $under_score (ตัวพิมพ์เล็กทั้งหมด เชื่อมแต่ละคำด้วย _)
  3. เมธอด (Methods) ควรอยู่ในรูปแบบ camelCase (คำแรกเป็นตัวพิมพ์เล็กทั้งหมด คำถัดมาขึ้นต้นด้วยตัวพิมพ์ใหญ่ และต่อคำโดยไม่มีสัญลักษณ์ใดๆคั่น)
<?php

namespace Vendor\Namespaces;

class ClassName
{
    // ค่าคงที่
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';

    // ตัวแปร
    public $under_score;

    // เมธอด
    function myFunction () {
    }
}