แนะนำตัว
ในการเขียนโปรแกรมเชิงวัตถุ คลาสนามธรรมคือคลาสที่สร้างอินสแตนซ์ได้ เช่น ไม่สามารถประกาศวัตถุของคลาสดังกล่าวได้ PHP รองรับแนวคิดของคลาส abstarct ตั้งแต่เวอร์ชัน 5.0
คลาสที่กำหนดด้วยคีย์เวิร์ด abstract จะกลายเป็นคลาสนามธรรม นอกจากนี้ คลาสใดๆ ที่มีเมธอดนามธรรมอย่างน้อยหนึ่งวิธีถือเป็นนามธรรมด้วย
ไวยากรณ์
<?php class testclass{ // } ?>
หากเราพยายามสร้างอ็อบเจ็กต์ oof คลาสนี้ PHP parser จะส่งข้อผิดพลาดดังต่อไปนี้ −
$a=new testclass(); PHP Fatal error: Uncaught Error: Cannot instantiate abstract class testclass
วิธีการแบบนามธรรม
วิธีการแบบนามธรรมจะประกาศเฉพาะลายเซ็น เช่น การมองเห็น อาร์กิวเมนต์ และประเภทการส่งคืนด้วยคำแนะนำประเภท และไม่มีฟังก์ชันการทำงานใดๆ คลาสที่สืบทอดคลาสนามธรรมดังกล่าวจะต้องแทนที่ (ให้คำจำกัดความ) เมธอดนามธรรมทั้งหมด วิธีการที่สอดคล้องกันในคลาสย่อยต้องมีลายเซ็นเดียวกันกับในคลาสพาเรนต์ หากคลาสย่อยไม่เป็นไปตามเงื่อนไขนี้ PHP parser จะส่งข้อยกเว้น คลาสที่ขยายคลาสนามธรรมสามารถสร้างอินสแตนซ์ได้แล้ว จึงเรียกว่าคลาสที่เป็นรูปธรรม
ในตัวอย่างต่อไปนี้ คลาสพาเรนต์มีเมธอดนามธรรมสองเมธอด ซึ่งมีเพียงหนึ่งเมธอดที่กำหนดใหม่ในคลาสย่อย ซึ่งส่งผลให้เกิดข้อผิดพลาดดังต่อไปนี้ -
ตัวอย่าง
<?php abstract class testclass{ abstract function test1(); abstract function hello(); } class myclass extends testclass{ function test1(){ echo "Overrides parent test method"; } } $a=new myclass(); ?>
ผลลัพธ์
ต่อไปนี้เป็นข้อความแสดงข้อผิดพลาด
PHP Fatal error: Class myclass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (testclass::hello)
วิธีนามธรรมพร้อมอาร์กิวเมนต์
เมื่อเมธอด abstract ถูกกำหนดด้วยอาร์กิวเมนต์ จะต้องถูกแทนที่ในคลาสย่อยด้วยจำนวนอาร์กิวเมนต์เท่ากัน
ในตัวอย่างต่อไปนี้ เมธอดนามธรรมในคลาสพาเรนต์มีสองอาร์กิวเมนต์ คลาสย่อยยังกำหนดฟังก์ชันเดียวกันกับสองอาร์กิวเมนต์
ตัวอย่าง
<?php abstract class testclass{ abstract function hello($name, $age); } class myclass extends testclass{ function hello($name, $age){ echo "My name is $name and my age is $age"; } } $a=new myclass(); $a->hello("Ravi",20); ?>
ผลลัพธ์
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
My name is Ravi and my age is 20