[PHP] Abstract Class มีไว้ทำอะไร?

 บทความนี้จะออกแนววิชาการหน่อย ส่วนตัวคิดว่ามีโอกาสน้อยที่เราจะได้เขียน Abstract class ไว้ใช้เอง ส่วนมากจะเจอตาม library หรือ framework ต่าง ๆ ที่ทำมาให้คนอื่นใช้เสียมากกว่า

Abstract Class คืออะไร

Abstract class คือ class ที่"ไม่สมบูรณ์" กล่าวคือมี abstract function ประกอบอยู่ (จริง ๆ ถึงไม่มีก็ประกาศเป็น Abstract class ได้ แต่มักไม่ทำกัน แต่ถ้ามี abstract function เมื่อไหร่ compiler จะบังคับให้เราประกาศเป็น Abstract class ทันที) โดย abstract function จะเป็น function ที่ถูกบังคับให้ class ลูก override function ทับเมื่อ extends abstract class มาใช้
ประโยชน์ของมันคือการวาง guideline ให้คนอื่นมาใช้เพื่อพัฒนาโค้ดของเราต่อไป อาจจะมีบาง function ที่ต้องโดนเรียกใช้แน่ ๆ แต่ content ของ function จะขึ้นอยู่กับ class ลูกที่ extends ไป ยกตัวอย่าง
<?php
abstract class LivingThings {
protected $scientificName;//สิ่งมีชีวิตมีชื่อวิทยาศาสตร์ abstract public function hasLegs() : boolean; abstract public function canFly() : boolean; } // Child classes class Cobra extends LivingThings { protected $scientificName = 'Naja'; public function hasLegs() : boolean { return false; } public function canFly() : boolean { return false; } } class Duck extends LivingThings { protected $scientificName = 'Anas'; public function hasLegs() : boolean { return true; } public function canFly() : boolean { return true; } } class Human extends LivingThings { protected $scientificName = 'Homo sapiens'; public function hasLegs() : boolean { return true; } public function canFly() : boolean { if (ขับเครื่องบิน) { return true; } return false; } } ?>

จะสังเกตเห็นว่าเราจะเขียนการทำงานภายใน function ได้เองแล้วแต่การทำงานของ class ลูกเลย ขอแค่ return type ถูก และต้องมี function นั้นอยู่

หลาย ๆ คนอาจสับสนกับ Interface ซึ่งจริง ๆ มันก็คล้ายกัน แต่ความแตกต่างจะมีดังนี้

  1. interface จะไม่มี property เลย
  2. fnction ภายใน interface ต้องเป็น public เท่านั้น ในขณะที่ abstract class จะเป็นได้ทั้ง public และ protected
  3. function ภายใน interface ต้องเป็น abstract function ทั้งหมด
  4. Class จะสามารถ extends ได้แค่ 1 class แต่ implements ได้หลาย interface
ตัวอย่างหนึ่งของการใช้งานจริงคือการเขียน Driver สำหรับเชื่อมต่อ Database แต่ละยี่ห้อ จะเห็นการใช้ abstract class เยอะมาก เพื่อเป็น guideline สำหรับคนที่อยากจะนำไปพัฒนา Driver ให้กับ Database ตัวใหม่ ๆ ว่าต้องมี function อะไรบ้าง ลองไปดูตัวอย่างได้ที่นี่ dbal/lib/Doctrine/DBAL/Driver at 2.12.x · doctrine/dbal (github.com) 

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

[Blue Archive] รวมล็อบบี้ความทรงจำ (Live2D)

[Blue Archive] รีวิวชินัตสึ (Chinatsu)

[Blue Archive] รีวิวมารินะ (Marina)

[Blue Archive] รีวิวสึมิเระ (Sumire)

[Arknights] รีวิว Penance