Abstract classes ในภาษา PHP

17 January 2017

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

Abstract class คืออะไร

Abstract class คือคลาสที่มีอย่างน้อยหนึ่งเมธอดที่ถูกกำหนดให้เป็น abstract ซึ่งในการประกาศ abstract เมธอดนั้นจะประกาศเพียงแค่ส่วนหัวของเมธอดหรือเมธอดที่ไม่มีโค้ดการทำงานอยู่ภายใน ในการใช้งาน Abstract class นั้นไม่สามารถนำไปสร้างออบเจ็คได้ มันใช้สำหรับการสืบทอดไปยัง Sub class และกำหนดการทำงานของ abstract เมธอดในคลาสทีไ่ด้รับการสืบทอด

Abstract Class diagram in PHP

จากรูปเป็นตัวอย่างของ Class diagram ของ Abstract class ตัวอย่างในการใช้งานของ Abstract class เช่น คลาสที่อาจจะมีการทำงานบางอย่างเหมือนกันโดยการใช้เมธอดร่วมกัน ในขณะเดียวกันก็อาจจะมีการทำงานอย่างอื่นที่ต่างกัน ซึ่งการทำงานที่แตกต่างกันนี้เรียกว่า abstract method และเมื่อมีการสืบทอดจาก Abstract class จึงทำการกำหนดการทำงานของเมธอดเหล่านั้นเพื่อวัตถุประสงค์ของแต่ละคลาส

ต่อไปมาดูตัวอย่างการใช้งาน Abstract class ในภาษา PHP ซึ่งเป็นโปรแกรมในการเล่นสื่อมัลติมีเดีย และมีการใช้งานบางเมธอดร่วมกัน และบางเมธอดแตกต่างกัน

<?php

abstract class Multimedia {

    public $name;
    public $extension;
    public $length;

    public function getDetail() {
        $minute = floor($this->length / 60);
        $second = $this->length % 60;
        $duration = "";
        if ($minute > 0) {
            $duration .= "$minute minutes ";
        }
        if ($second > 0) {
            $duration .= "$second seconds";
        }

        echo "Name: $this->name.$this->extension\n";
        echo "Duration: $duration\n";
    }

    abstract public function play();

}

class Video extends Multimedia {

    public function play() {
        echo "Playing video...\n";
    }

}

class Music extends Multimedia {

    public function play() {
        echo "Playing music...\n";
    }

}

$video = new Video();
$video->name = "PHP tutorial on Marcuscode";
$video->extension = "mp4";
$video->length = 584;

$video->play();
$video->getDetail();

$music = new Music();
$music->name = "Trinity";
$music->extension = "mp3";
$music->length = 317;

$music->play();
$music->getDetail();

?>

ในตัวอย่างเป็นการสร้างและใช้งาน Abstract class ในภาษา PHP โดยการใช้คำสั่ง abstract ในสร้าง Abstract class และเมธอด เราได้สร้างคลาส Multimedia ที่มีการเก็บข้อมูลของสื่อมัลติมีเดียที่ประกอบไปด้วย ชื่อ นามสกุลของไฟล์ และความยาว เมธอด getDetail() เป็นเมธอดในการแสดงข้อมูลของสื่อข้อมูล

abstract public function play();

ภายในคลาส Multimediaได้มีการประกาศ abstract เมธอดซึ่งมีการกำหนดเพียงส่วนหัวของเมธอดเท่านั้น และเมธอดนี้จะมีการกำหนดการทำงานเมื่อมันถูกสืบทอดไปยัง Sub class เพราะว่าในการเล่นสื่อมัลติมีเดียของแต่ละคลาสนั้นจะมีความแตกต่างกัน ดังนั้นมันจึงถูกประกาศเป็น abstract เมธอดเพื่อกำหนดการทำงานในภายหลัง

class Video extends Multimedia {

    public function play() {
        echo "Playing video...\n";
    }

}

class Music extends Multimedia {

    public function play() {
        echo "Playing music...\n";
    }

}

ต่อเราสร้างสองคลาสคือ Video และ Music และทั้งคลาสคลาสนี้สืบทอดมาจาก Abstract class เราได้มีการกำหนดการทำงานให้กับเมธอด play() ในคลาสวิดีโอและคลาสเพลงที่มีการทำงานต่างกัน เช่น เมื่อเล่นเพลงจะมีแค่เสียง ในขณะที่วิดีโอนั้นมีทั้งภาพและเสียง เราจึงได้กำหนดการทำงานในเมธอดดังกล่าวเพื่อให้เข้ากับการทำงานของคลาสนั้นๆ

Playing video...
Name: PHP tutorial on Marcuscode.mp4
Duration: 9 minutes 44 seconds
Playing music...
Name: Trinity.mp3
Duration: 5 minutes 17 seconds

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

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

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