คำหลักสุดท้ายถูกนำมาใช้โดย PHP5 ที่เกี่ยวข้องกับแนวคิดการเขียนโปรแกรมเชิงวัตถุ
แต่ก่อนที่เราจะเข้าสู่รอบชิงชนะเลิศ เราต้องแน่ใจว่าเราเข้าใจแนวคิดเรื่องมรดกเป็นอย่างดีเสียก่อน ในการสืบทอด เราสามารถสืบทอดคลาสจากคลาสอื่นได้ นอกจากนี้ เราสามารถแทนที่ฟังก์ชันในคลาสที่สืบทอดมา เพื่อแทนที่การทำงานเดิมที่มีให้ ในบางกรณี เราอาจต้องป้องกันไม่ให้คลาสถูกสืบทอด หรือเราอาจจำเป็นต้องป้องกันไม่ให้ฟังก์ชันถูกแทนที่ สามารถทำได้ด้วยขั้นสุดท้าย โดยนำหน้าคลาสและฟังก์ชันด้วยคีย์เวิร์ดสุดท้าย ซึ่งทำให้ PHP เกิดข้อผิดพลาดในกรณีที่ไม่มีใครพยายามขยายคลาสสุดท้ายหรือแทนที่ฟังก์ชันสุดท้าย
หมายเหตุ:
เราใช้ได้เฉพาะคีย์เวิร์ดสุดท้ายกับเมธอดและคลาสเท่านั้น
มาสาธิตแนวคิดโดยใช้ตัวอย่างด้านล่าง
ตัวอย่าง:
เราไม่สามารถแทนที่ฟังก์ชันคลาสหลักได้
<?php
class BaseClass{
final function calculate($val1,$val2){
$sum = $val1+$val2;
echo "Sum of given no=".$sum;
}
}
class ChildClass extends BaseClass{
function calculate($x,$y){
$mult=$val1*$val2;
echo "Multiplication of given no=".$mult;
}
}
$obj= new ChildClass();
$obj->show(10,10);
?> ผลลัพธ์:
PHP Fatal error: Cannot override final method BaseClass::calculate()
คำอธิบาย:
ในตัวอย่างข้างต้นคลาส BaseClass ซึ่งเป็นคลาสหลัก โดยวิธีการคำนวณจะถูกทำเครื่องหมายเป็นขั้นสุดท้าย หมายความว่าเราไม่สามารถแทนที่วิธีการแสดงในคลาสย่อยใด ๆ เพื่อระบุข้อผิดพลาด ChildClass พยายามกำหนดวิธีการสุดท้าย show () สิ่งนี้จะทำให้เกิดข้อผิดพลาดร้ายแรง หมายความว่าวิธีสุดท้ายของคลาสพาเรนต์ไม่สามารถกำหนดในคลาสย่อยได้
ตัวอย่าง:
ใช้คีย์เวิร์ด "Final" Before The Class
<?php
final Class BaseClass{
function printData($val1,$val2){
$add=$val1+$val2;
echo "Sum of given no=".$s;
}
}
class Child extends BaseClass{
function printData($val1,$val2){
$m=$val1*$val2;
echo "Multiplication of given no=".$m;
}
}
$obj= new Child();
$obj->printData(20,20);
?> ผลลัพธ์:
PHP Fatal error: Class Child may not inherit from final class (BaseClass)
คำอธิบาย:
ในคลาสตัวอย่างข้างต้น BaseClass กำหนดด้วยส่วนสุดท้าย ผลลัพธ์นั้นเราไม่สามารถขยายคลาสนี้ได้ เมื่อคลาส Child พยายามขยายจาก BaseClass (ซึ่งหมายถึง Child เป็นคลาสย่อยของ BaseClass) สำหรับสถานการณ์นี้ PHP จะแสดงข้อความแสดงข้อผิดพลาด “Class Child อาจไม่สืบทอดจากคลาสสุดท้าย (BaseClass)” หมายความว่าจะไม่อนุญาตให้สร้างคลาสย่อยของ BaseClass