PHP กับ OOP มาปูพื้นฐานกันเสียใหม่ก่อน

วันนี้จะมาคุยถึงเรื่อง Object-oriented programming (OOP) ในภาษา PHP กันซะพอหอมปากหอมคอ

ก่อนอื่นนั้น เท่าที่สังเกตุส่วนมาก Developers สมัยนี้แทบจะเรียกว่า เขียนโปรแกรมแบบ OOP “เป็น” กันหมดแล้ว เพราะว่าสมัยนี้ Framework หรือว่า Components ต่างๆ นั้นถูกผลิตมาแบบ OOP เป็นเสียส่วนใหญ่ จริงๆ ก็เรียกได้ว่า แทบจะ 100% เลยทีเดียว ทั้ง Yii, CI, Zend, etc. ซึ่งแน่นอนเราก็หลักเลี่ยงที่จะใช้มันไม่ได้เสียด้วย ทีนี้พอ Developers ใช้ของพวกนี้บ่อยๆ เข้าจนชำนาญ ก็พาลคิดไปว่า กรูนี่เขียน OOP “เป็น” แต่ไอ้คำว่า เป็น นี่ต้องมาดูกันอีกทีว่าเป็น แค่นั้น เพราะว่าของพวกนี้ มันต้องมี Basic ครับ ไม่สามารถกระโดดข้ามขั้นไปได้

เพราะว่าถ้า Basic ไม่แน่น ขาดความเข้าใจพื้นฐาน มันก็จะพาล ไปเขียนโคดแบบ Procedural ใน OOP Framework เสียฉิบ ไล่มาตั้งแต่ Keywords ของ OOP เลย ต้องทำความเข้าใจให้ครบถ้วน อาทิเช่น

interface + implements ใช้ทำอะไร

abstract class คืออะไร

public, private, final, protected ต่างกันยังไง

static ใช้ทำอะไร ต้องใช้แบบไหนจึงจะเหมาะสม

พอไล่เรื่อง keywords จบก็ควรจะศึกษาเรื่อง Design Patterns ต่อ เพราะว่า การเขียน oop ไม่ใช่มีแบบเดียว ต้องเลือกเขียนให้เหมาะสมกับงานที่จะใช้งาน

โดยส่วนนี้ผมขออ้างอิงจากบทความของ คุณ Robert Gonzalez (ชื่อแม่งเหมือนนักมวยเลย) ซึ่งเขียนได้น่าสนใจมากๆลองอ่านดูนะครับ

OOP Design Patterns for PHP

หลังจากทำความข้าใจกับ Patterns ต่างๆ ได้ ทีนี้เวลาเราเจอกับ โจทย์ เราก็จะเลือก คำตอบที่ถูกต้องกับงานได้ครับ อาทิเช่น

ผมมีโจทย์ที่ต้องเขียน ติดต่อกับ Database ซึ่งโจทย์ผม บอกว่า ผมต้องติดต่อกับฐานข้อมูลได้ทั้งหมด ผมก็จะออกแบบ Class ได้ถูกต้องว่า Design Pattern มันต้องเป็นแบบ Factory Design

เหมือนกับว่า ผมเป็นโรงงาน ขนม ไม่ว่า วัตถุดิบน้ำตาลผมมาจาก โรงงานแถวภาคไหน ผมก็ต้องผลิตขนมชนิดเดิมออกมาให้ได้ โดยใช้เครื่องจักรตัวเดิม

ถ้าเปรียบกับโจทย์ก็คือ ไม่ว่าผมจะใช้ Database อะไร Output ผมต้องออกมาเหมือนเดิม โดยไม่เปลี่ยน วิธีการเขียนติดต่อ เปลี่ยนแค่ adapter บางตัว ซึ่งอยู่ภายใน Factory ผมอีกที

ซึ่ง Class แบบนี้เป็น รูปแบบ OOP ที่เขียนลำบากแต่ว่าคุ้มค่ามากที่จะเขียน ตัวอย่างงานที่ต้องใช้ Class แบบนี้ก็คือ

1. Database Drivers

2. Hub Payment Gateways

3. Encryption

4. Caching

5. Hub SMS Gateway

แล้วก็อีกเยอะครับ, ทำไมต้องใช้แบบนี้ ??

อืมม์ ลองนึกตามดูครับ เอาเป็นเรื่อง Gateway ละกัน โจทย์ของผมมีว่า ผมต้องการทำระบบ คิดเงินออนไลน์ แต่ว่า Gateway ผมจะใช้แม่งทุกตัวเลย ตั้งแต่ Paypal, Google Checkout, 2Checkout ทีนี้ ถ้าผมต้องมาเขียน if else ในโปรแกรมผมแบบว่า

<?php

switch ($gateway)
{
case 'paypay' :

break;
case 'gg_checkout' :

break;
case '2checkout' :
break;
}

?>