PHP Coding Standard

Reference:
http://framework.zend.com/manual/en/coding-standard.html

อ้างอิงจาก Zend Framework Coding Standard

PHP File Formatting (รูปแบบทั่วไป)
- File ที่มีแต่ PHP code ให้เริ่มด้วย <?php และไม่ต้องปิดด้วย ?>
เพื่อป้องกัน space ที่เกินอยู่หลัง ?> ต่อท้าย output โดยไม่ตั้งใจ
- ย่อหน้า 4 space -- ห้ามใช้ Tab
- ไม่ควรให้บรรทัดยาวเกิน 80 ตัวอักษร แต่ในกรณีที่จำเป็น 120 ตัวอักษรก็ยังพอได้อยู่
- ให้ปิดบรรทัดด้วยตัวปิดบรรทัดแบบ UNIX (0x0A)

Naming Conventions (การตั้งชื่อ)
- Class ให้ขึ้นด้วยตัวอักษรใหญ่
- Filename ให้ลงท้ายด้วย .php (555)
- Function and method ให้ใช้ตัวอักษรล้วน (a-z, A-Z) แบบ "camelCase"
(ขึ้นด้วยตัวอักษรเล็ก และใช้ตัวใหญ่เมื่อเริ่มต้นคำใหม่)
- Variable (ตัวแปร) ให้ใช้แบบเดียวกับ function และ method
- Constant (ค่าคงที่) ให้ใช้ตัวอักษรใหญ่และคั่นระหว่างคำด้วย _

Coding Style (การเขียน code)
ใช้ tag แบบเต็มรูปแบบ

<?php 

?>

และถ้า File นั้นมีแต่ PHP code ก็ไม่จำเป็นต้องปิดด้วย ?>

Strings
- String ธรรมดาใช้ Single Quote ปิด

$a = 'Example String';

- String ที่มี Single Quote ให้ใช้ Double Quote แทน

$sql = "SELECT `id`, `name` from `people` WHERE `name`='Fred' OR `name`='Susan'";

- String ที่มีการแทนด้วยตัวแปรให้ใช้ได้ 2 รูปแบบ

$greeting = "Hello $name, welcome back!";
$greeting = "Hello {$name}, welcome back!";

- การต่อ String ด้วย "." ให้เว้นวรรคหน้าและหลัง . ด้วย เพื่อความง่ายในการอ่าน

$company = 'Zend' . ' ' . 'Technologies';

สำหรับการต่อ String ข้ามบรรทัดให้วางจุดไว้หน้าบรรทัด ให้ตรงกับเครื่องหมายเท่ากับ

$sql = "SELECT `id`, `name` FROM `people` "
     . "WHERE `name` = 'Susan' "
     . "ORDER BY `name` ASC ";

ผมคิดว่าน่าจะเอาตัวเชื่อม (.) ไว้ที่บรรทัดก่อนหน้าน่าจะดี
จะได้ไม่สับสนว่าต้องวางเครื่องหมายไว้บรรทัดบน หรือล่าง
ไว้ข้างบนหมดเลยน่าจะดีกว่า เผื่อว่าต้องไปเขียนภาษาอื่นที่ไม่ต้องปิดบรรทัด
เช่น python, ruby, ... จะได้ฝึกวางตัวเชื่อมทิ้งไว้บรรทัดบนด้วย หึหึ

Arrays
- Numerical Indexed Array (ใช้ตัวเลขเป็น index) ให้เคาะ space หลังจากเครื่องหมาย , เสมอ
(เป็นพื้นฐานของการพิมพ์ดีด -- ทำให้อ่านง่ายด้วยครับ)
- Associative Array (ใช้ string เป็น key) ให้เรียง Key และ Value ทั้งหมดให้อยู่ในแนวเดียวกัน

$sampleArray = array('firstKey'  => 'firstValue',
                     'secondKey' => 'secondValue');

Classes
- Class Declaration
ตั้งชื่อตาม naming convention, มี document block

/**
 * Documentation Block Here
 */
class SampleClass {
    // all contents of class
    // must be indented four spaces
}

ผมแก้นิดหน่อย ไม่ตรงตาม ZF นะ

- Class Member Variables
ตั้งชื่อตาม naming convention, ห้ามใช้ var ให้ใช้ private, protected หรือ public
(ไม่แนะนำให้ใช้ public member ควรใช้ accessor method (set-get) ดีกว่า)

Functions and Methods

/**
 * Documentation Block Here
 */
class Foo {
    /**
     * Documentation Block Here
     */
    public function bar() {
        // all contents of function
        // must be indented four spaces
    }
}

การส่ง Parameter by reference จะต้องถูกกำหนดตั้งแต่การ declare
ไม่ควรกำหนดตอนเรียกใช้ function เช่น

    public function bar(&$baz) {
    }

return ไม่ต้องใส่วงเล็บ

    public function bar() {
        return $this->bar;
    }

Control Statements
- If/Else/ElseIf

if ($a != 2) {
    $a = 2;
} elseif ($a == 3) {
   $a = 4;
} else {
   $a = 7;
}

ให้ใช้ { } เสมอแม้ว่าจะมีประโยคเดียว

- Switch

switch ($numPeople) {
    case 1:
        break;

    case 2:
        break;

    default:
        break;
}