PHP5 มาพร้อมกับโมเดลเชิงวัตถุด้วย แนวคิดบางอย่างของโมเดลเชิงวัตถุ ได้แก่ คลาส วัตถุ การห่อหุ้ม ความหลากหลาย คลาสนามธรรมและขั้นสุดท้าย และเมธอด อินเทอร์เฟซและการสืบทอด ฯลฯ... ในบทความนี้
เราจะพูดถึง Abstract Class และคุณลักษณะที่เกี่ยวข้องกับเทคนิคเชิงวัตถุใน PHP นอกจากนี้ เราจะได้เรียนรู้การใช้งาน Abstract Class พร้อมตัวอย่างบางส่วน
แต่ก่อนจะดำดิ่งลึกเกินไป เรามาเรียนรู้วิธีกำหนดคลาสนามธรรมกันก่อน
เราสามารถประกาศคลาสเป็นนามธรรมโดยติดชื่อของคลาสด้วยคำสำคัญที่เป็นนามธรรม คำจำกัดความนั้นชัดเจนมาก คลาสที่มีเมธอดนามธรรมเรียกว่าคลาสนามธรรม วิธีนามธรรมกำหนดในคลาสนามธรรมเพียงแค่มีชื่อและอาร์กิวเมนต์ และไม่มีรหัสอื่น
ไม่สามารถสร้างวัตถุของคลาสนามธรรมได้ แต่เราจำเป็นต้องขยายคลาสย่อยที่คำนวณคำจำกัดความของฟังก์ชันลงในเนื้อหาของเมธอดนามธรรมในคลาสย่อย และใช้คลาสย่อยเหล่านี้เพื่อสร้างออบเจกต์
มาพูดคุยกันถึงข้อเท็จจริงที่สำคัญบางประการเกี่ยวกับคลาสนามธรรมใน PHP:
1.คลาสนามธรรมสามารถมีนามธรรมควบคู่ไปกับวิธีที่ไม่เป็นนามธรรมได้
ตัวอย่าง:
<?php abstract class base { abstract function printdata(); public function getdata() { echo "Tutorials Point"; } } class child extends base{ public function printdata(){ echo "Good morning"; } } $obj = new child(); $obj->getdata(); ?>
ผลลัพธ์:
Tutorials Point
2.ไม่สามารถยกตัวอย่างได้โดยตรง
ตัวอย่าง:
<?php abstract class AbstractClass{ abstract protected function calculate(); public function adddata() { echo "Addition done"; } } $obj=new AbstractClass(); $obj->adddata(); ?>
ผลลัพธ์:
Fatal error: Uncaught Error: Cannot instantiate abstract class AbstractClass
3. การมองเห็นที่เหมือนกัน (หรือจำกัดน้อยกว่า):
คลาสย่อยทั้งหมดต้องกำหนดเมธอดทั้งหมดที่ทำเครื่องหมายเป็นนามธรรมในคลาสพาเรนต์ โดยต้องกำหนดเมธอดทั้งหมดเหล่านี้ด้วยลายเซ็นเดียวกันหรือลายเซ็นที่จำกัดน้อยกว่า สมมติว่าในคลาสพาเรนต์ หากเรากำหนดเมธอดนามธรรมด้วยการมองเห็นที่มีการป้องกัน ในการเรียกใช้คลาสลูก ควรกำหนดด้วย aorpublic ที่ได้รับการป้องกัน แต่ไม่ใช่แบบส่วนตัว
ตัวอย่าง:
<?php abstract class AbstractBaseClass1{ abstract public function addValue(); abstract protected function getValue(); } class ConcreteClass extends AbstractBaseClass1{ protected function addValue() { return "ConcreteClass"; } public function getValue() { return " Child Class"; } } $classobj = new ConcreteClass; $classobj->addValue(); ?>
ผลลัพธ์:
Fatal errorAccess level to ConcreteClass::addValue() must be public (as in class AbstractBaseClass1)
4.วิธีนามธรรมต้องไม่มีเนื้อหา:
เมธอดที่ประกาศเป็นนามธรรมเพียงแค่ประกาศลายเซ็นของเมธอด - ไม่สามารถกำหนดใครในนั้นได้ ถึงแม้ว่าร่างกายจะปรากฎอยู่ในวิธีที่ไม่เป็นนามธรรมก็ตาม
ตัวอย่าง:
<?php abstract class ParentClass{ abstract protected function printValue(){ return "Good morning"; } } class ClassA extends ParentClass{ protected function printValue() { return "ConcreteClass1"; } } $classobj = new ClassA; $classobj->printValue(); ?>
ผลลัพธ์:
PHP Fatal error: Abstract function ParentClass::printValue() cannot contain body
5.คลาสใดๆ ที่มีเมธอดนามธรรมอย่างน้อยหนึ่งเมธอดต้องประกาศเป็นคลาสนามธรรม:
คลาสนามธรรมสามารถมีวิธีการที่เป็นนามธรรมและไม่ใช่นามธรรมได้ แต่ต้องมีวิธีนามธรรมอย่างน้อยหนึ่งวิธี หากมีวิธีการที่เป็นนามธรรม ก็ควรประกาศให้เป็นนามธรรม
ตัวอย่าง:
<?php class AbstractClass { abstract protected function getValue(); public function printData() { echo " Welcome to Tutorials Point"; } } $obj=new AbstractClass(); $obj->printData(); ?>
ผลลัพธ์:
PHP Fatal error: Class AbstractClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)
6.คลาสนามธรรมไม่รองรับการสืบทอดหลายรายการ:
ไม่รองรับการสืบทอดหลายรายการ
ตัวอย่าง:
<?php Abstract class SuperClass{ public abstract function test(); protected function welcome(){ echo "Good morning"; } } class ClassA extends SuperClass{ public function test(){ echo "Hello"; } protected function welcome(){ echo "Good afternoon"; } } class ClassB extends SuperClass{ public function test(){ echo "Hello"; } protected function welcome(){ echo "Good evening"; } } class ClassC extends ClassA, ClassB{ public function test1(){ $c = new self(); $c->welcome(); } } ?>
ผลลัพธ์:
Error
คำอธิบาย:
ที่นี่เราได้ประกาศ SuperClass เป็นคลาสนามธรรมที่มีเมธอด test() และ welcome() และ ClassA และ ClassB และคลาสที่เป็นรูปธรรมขยายจากคลาสนามธรรม จากนั้นเราได้พยายามสร้าง ClassC ที่ขยายจาก ClassA และ ClassB ดังที่เห็นได้ชัดจากโค้ด เมื่อเรียกใช้เมธอด welcome() โดยใช้อ็อบเจกต์ ClassC จึงเป็นไปไม่ได้ที่คอมไพเลอร์จะเลือกว่าจะเรียกเมธอด welcome() ของ ClassA หรือเมธอด welcome() ของ ClassB ดังนั้น เพื่อหลีกหนีจากความยุ่งยากดังกล่าว PHP จึงไม่รองรับการสืบทอดหลายรายการ
หมายเหตุ:
คลาสนามธรรมสามารถขยายคลาสนามธรรมอื่น คลาสนามธรรมสามารถจัดเตรียมการใช้งานอินเทอร์เฟซได้