การเขียนโปรแกรมเชิงวัตถุ ในภาษา PHP

23 January 2017

การเขียนโปรแกรมเชิงวัตถุ (Object-oriented programming) หรือ OOP นั้นเป็นการเขียนโปรแกรมโดยมองทุกอย่างเป็นเหมือนวัตถุ (Object) ซึ่งวัตถุจะประกอบไปด้วยข้อมูล ในรูปแบบของคุณสมบัติ (Property) และกระบวนการทำงาน (Method) คุณสมบัติที่สำคัญของออบเจ็คคือ เมธอดของมันจะทำงานและจัดการกับ Property ของออบเจ็คนั้น

ในภาษา PHP นั้นสนับสนุนการเขียนโปรแกรมเชิงวัตถุตั้งแต่ PHP 5 ซึ่งเป็นการเปลี่ยนแปลงที่สำคัญของภาษา PHP ในภาษาที่รองรับการเขียนโปรแกรมเชิงวัตถุนั้น โปรแกรมคอมพิวเตอร์จะถูกออกแบบให้จัดการกับออบเจ็คที่อาจจะมีปฏิสัมพันธ์กับออบเจ็คอื่น ในภาษา PHP นั้นออบเจ็คถูกสร้างมาจากคลาส (Class bass) ซึ่งหมายความว่ามันเป็นตัวแปรของคลาส (Class instance) หรือกล่าวอีกนัยหนึ่ง คลาสเป็นประเภทข้อมูลของออบเจ็ค

ออบเจ็คและคลาส

ภาษาที่สนับสนุนการเขียนโปรแกรมเชิงวัตถุมักจะใช้คุณสมบัติการสืบทอด (Inheritance) ซึ่งเป็นการนำโค้ดเดิมกลับมาใช้และเพิ่มเติมการทำงานทั้งในรูปแบบของคลาสและ Prototype ต่อไปนี้เป็นแนวคิดในการทำงานของออบเจ็คและคลาสในภาษา PHP

  • คลาส คือประเภทข้อมูลที่นำไปสร้างออบเจ็ค คลาสถูกกำหนดขึ้นมาโดยมีสมาชิกที่เป็นตัวแปร ฟังก์ชัน คอนสตรัคเตอร์และ Destructor หรือกล่าวอีกนัยหนึ่งคลาสเป็นเทมเพลตในการนำไปสร้างออบเจ็คโดยมีการกำหนดค่าเริ่มต้นและฟังก์ชันการทำงาน
  • ออบเจ็ค คือตัวแปรประเภทหนึ่งที่สร้างมาจากคลาสหรือ Class Instance ซึ่งออบเจ็คมีการอ้างถึงสมาชิกของมันที่เป็นตัวแปรและเมธอด ซึ่งในภาษา PHP นั้นทุกอย่างต่างก็เป็นออบเจ็คไม่ว่าจะเป็น ตัวแปร อาเรย์ หรือฟังก์ชัน คลาสเป็นเหมือนประเภทข้อมูลที่นำมาสร้างออบเจ็ค ดังนั้นออบเจ็คหลายออบเจ็คอาจจะมีการสร้างมาจากคลาสเดียวกัน (Class base)

ในการเขียนโปรแกรมเชิงวัตถุ มีคุณสมบัติที่สำคัญที่ทำให้การเขียนโปรแกรมมีประสิทธิภาพมากขึ้น มันช่วยให้โค้ดของคุณยืดหยุ่น ปลอดภัย และการใช้งานโค้ดเดิมซ้ำๆ โดยไม่ต้องเขียนขึ้นใหม่

Inheritance

Inheritance คือคุณสมบัติการสืบทอด โดยการที่คลาสหนึ่งจะถ่ายทอดโครงสร้างของคุณสมบัติ (Property) และกระบวนการทำงาน (Methods) ไปยังคลาสอื่น นี่เป็นสิ่งที่จะช่วยให้การเขียนโปรแกรมนำโค้ดเดิมกลับมาใช้และพัฒนาเพิ่มเติมจากคลาสเดิมได้ คลาสที่สืบทอดคุณสมบัติไปยังคลาสอื่นเราเรียกว่าคลาสหลัก (Parent class) และคลาสที่ถูกถ่ายทอดเรียกว่าคลาสย่อย (Sub class)

การสืบทอดนั้นเป็นแนวคิดมาจากการดำเนินชีวิตประจำวัน บริษัท A ได้ทำการออกแบบรถยนต์โดยมีคุณสมบัติและการทำงานที่รถยนต์จะทำได้ สิ่งเหล่านี้ถูกกำหนดเป็นคลาสของรถยนต์ คลาสของรถยนต์นี้จะถูกนำไปสร้างหลายโมเดล และทุกโมเดลจะมีการทำงานหลักที่สืบทอดมาจากคลาสของรถยนต์ เช่น การสตาร์ทเครื่อง การดับเครื่อง การวิ่งไปข้างหน้า การเบรก เป็นต้น และแต่ละโมเดลอาจจะมีการปรับแต่งคุณสมบัติและเพิ่มการทำงานบางอย่างที่นอกเหนือจากที่กำหนดไว้ในคลาสของรถยนต์ (Parent class) ได้

Encapsulation

Encapsulation คือคุณสมบัติในการปกปิดข้อมูลโดยเป็นกลไกลในการเข้าถึงข้อมูลภายในออบเจ็คจากภายนอก ในการเขียนโปรแกรมเชิงวัตถุในภาษา PHP โดยทั่วไปแล้วข้อมูลภายในคลาสจะไม่ถูกปกปิดโดยอัตโนมัติ คุณสมบัตินี้เกี่ยวข้องกับตัวกำหนดการเข้าถึง (Access specifier) ซึ่งเป็นคำสั่งในการควบคุมการเข้าถึงข้อมูลภายในออบเจ็ค เช่น คำสั่ง public protected และ private

Encapsulation ช่วยให้ข้อมูลที่ไม่จำเป็นถูกปกปิดไว้แต่มันยังมีอยู่ ยกตัวอย่างเช่น บนหน้าปัดของรถยนต์นั้นจะนำเฉพาะข้อมูลที่จำเป็นมาแสดง เช่น จำนวนรอบ ความเร็วของการวิ่ง ปริมาณน้ำมันเชื่้อเพลิง หรือสัญญาณไฟต่างๆ ซึ่งในความเป็นจริง ในการที่จะได้ข้อมูลเหล่านี้มานั้น อาจจะใข้ข้อมูลหรือวิธีการทำงานต่างๆ มากมาย ดังนั้นแนวคิดนี้จึงทำให้การเขียนโปรแกรมสามารถกำหนดการเข้าถึงตามบริบทของการใช้งานได้

Polymorphism

Polymorphism คือคุณสมบัติของการมีได้หลายรูปแบบ (Many form) ของออบเจ็ค ในการเขียนโปรแกรมเชิงวัตุ Polymorphism คือการที่คลาสใช้ Interfaces หรือสืบทอดมาจากคลาส (Abstract class) เดียวกันสำหรับกำหนดการทำงานของคลาส ตัวอย่างของเช่น คลาสของรูปทรงในสองมิติ (Sharp) ใช้ในการกำหนดคุณสมบัติและการทำงานของรูปทรง เช่น การวาดรูปทรง การหาขนาด หรือการหาพื้นที่ ซึ่งสิ่งเหล่านี้เป็นสิ่งที่รูปทรงทุกประเภทจะต้องมี มันจึงเป็น Interfaces เดียวกัน และเรานำคลาสของรูปทรงนี้ไปสร้างรูปทรงต่างๆ เช่น ทรงกลม สามเหลี่ยม สี่เหลี่ยม เป็นต้น เมื่อเราเรียกใช้เมธอดในการวาดรูปทรง ผลลัพธ์ที่ได้จะเป็นรูปทรงต่างๆ โดยการเรียกใช้เมธอดเดียวกันแต่การทำงานต่างกัน เพราะว่ารูปทรงแต่ละแบบถูกกำหนดการทำงานของมันเอง และมันยังสามารถเรียกใช้งานการทำงานใน Parent class ได้

รูปแบบของโค้ด OOP ในภาษา PHP

ในการเขียนโปรแกรมเชิงวัตถุ เรามองทุกอย่างเป็นเหมือนออบเจ็คในโลกจริง ในภาษา PHP ทุกอย่างนั้นเป็นออบเจ็ค เช่น ตัวแปรประเภทต่าง ฟังก์ชัน และโครงสร้างทางภาษา เราจะยกตัวอย่างแนวคิดและการมองในรูปแบบของการเขียนโปรแกรม

เพราะเรามองทุกอย่างเป็นออบเจ็ค เราให้รถยนต์เป็นออบเจ็ค ซึ่งจะประกอบไปด้วยคุณสมบัติคือ สี ชื่อ โมเดล ความจุของเชื้อเพลง จำนวนล้อ หมายเลขตัววัดระยะทาง และการทำงานคือ สตาร์ทเครื่อง หยุดเครื่อง วิ่ง การเลี้ยวซ้าย การเลี้ยวขวา การเบรก เป็นต้น ซึ่งเมื่อเรานำข้อกำหนดเหล่านี้มาสร้างในรูปแบบการทำงานของคลาสในภาษา PHP จะได้ดังนี้

class Car {

    // Properties
    public $name;
    public $model;
    public $color;
    public $NumberOfDoor;
    public $fuelCapacity;
    public $gaugeNumber;

    // Methods
    public function startEngine() {
        // Code to start engine
    }

    public function stopEngine() {
        // Code to stop engine
    }

    public function run() {
        // Code to run a car
    }

    public function turnLeft() {
        // Code to turn left
    }

    public function turnRight() {
        // Code to turn left
    }

    public function brake() {
        // Code to brake a car
    }

}

ในตัวอย่าง เป็นการสร้างคลาส Car ซึ่งเป็นคลาสสำหรับรถยนต์ที่ประกอบไปด้วยคุณสมบัติและการทำงาน โดยทั่วไปแล้วในการเขียนโปรแกรมเชิงวัตถุ คลาสมักจะนำไปแสดงผลเป็น UML diagram ซึ่งเป็นการกำหนดคุณสมบัติและการทำงานของภาพด้วยรูปภาพ รูปข้างล่างนี้เป็น UML diagram สำหรับคลาสรถยนต์จากโค้ดตัวอย่างข้างบน

UML diagram of Car class

ในรูปภาพเป็น UML diagram จากคลาส Car ซึ่ง UML diagram ก็คือแผนภาพที่ง่ายต่อการเข้าใจ และใช้สำหรับการออกแบบคลาสเพื่อนำไปพัฒนาและสร้างความสัมพันธ์ระหว่างคลาสกับคลาสอื่น เช่น การสืบทอด การใช้ Interfaces แผนภาพนี้แสดงรายละเอียดที่กำหนดภายในคลาสอย่างคร่าวๆ เช่น คุณสมบัติ และการกำหนดชื่อและประเภทของเมธอด เป็นต้น

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมเชิงวัตถุในภาษา PHP เราได้พูดเกี่ยวกับแนวคิดของคลาสและออบเจ็ค รวมถึงคุณสมบัติที่สำคัญต่างๆ ในการเขียนโปรแกรมเชิงวัตถุ เช่น Inheritance Encapsulation และ Polymorphism ในบทต่อไป จะเป็นการเริ่มต้นของการเขียนโปรแกรมเชิงวัตถุในภาษา PHP

บทความนี้เป็นประโยชน์หรือไม่? Yes · No