มีสามสถานการณ์ (ที่ฉันคิดได้) ที่คุณจะเรียกใช้เมธอดในคลาสย่อยโดยที่เมธอดออกจากคลาสพาเรนต์:
เมธอดไม่ได้ถูกเขียนทับโดยคลาสย่อยมีอยู่ในพาเรนต์เท่านั้น
นี่เป็นเช่นเดียวกับตัวอย่างของคุณและโดยทั่วไปแล้วจะดีกว่าที่จะใช้$this -> get_species();
คุณพูดถูกว่าในกรณีนี้ทั้งสองเหมือนกันอย่างมีประสิทธิภาพ แต่วิธีนี้ได้รับการสืบทอดมาจากคลาสย่อยดังนั้นจึงไม่มีเหตุผลที่จะแยกความแตกต่าง โดยการใช้$this
คุณจะต้องสอดคล้องกันระหว่างวิธีการสืบทอดและวิธีการที่ประกาศในเครื่อง
เมธอดถูกเขียนทับโดยคลาสย่อยและมีตรรกะที่ไม่ซ้ำกันโดยสิ้นเชิงจากพาเรนต์
ในกรณีนี้เห็นได้ชัดว่าคุณต้องการใช้$this -> get_species();
เนื่องจากคุณไม่ต้องการให้เมธอดเวอร์ชันของผู้ปกครองดำเนินการ อีกครั้งโดยใช้อย่างสม่ำเสมอ$this
คุณไม่จำเป็นต้องกังวลเกี่ยวกับความแตกต่างระหว่างกรณีนี้กับกรณีแรก
เมธอดขยายคลาสพาเรนต์โดยเพิ่มสิ่งที่เมธอดพาเรนต์บรรลุ
ในกรณีนี้คุณยังคงต้องการใช้`$this -> get_species();
เมื่อเรียกใช้เมธอดจากเมธอดอื่นของคลาสย่อย ที่เดียวที่คุณจะเรียกว่าเมธอดหลักจะมาจากเมธอดที่เขียนทับเมธอดหลัก ตัวอย่าง:
abstract class Animal {
function get_species() {
echo "I am an animal.";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
}
function get_species(){
parent::get_species();
echo "More specifically, I am a dog.";
}
}
สถานการณ์เดียวที่ฉันสามารถจินตนาการได้ว่าคุณจะต้องเรียกใช้เมธอดผู้ปกครองโดยตรงนอกวิธีการลบล้างคือถ้าพวกเขาทำสองสิ่งที่แตกต่างกันและคุณรู้ว่าคุณต้องการเมธอดเวอร์ชันของผู้ปกครองไม่ใช่เฉพาะในพื้นที่ ไม่ควรเป็นเช่นนั้น แต่ถ้ามันปรากฏตัววิธีที่สะอาดในการเข้าถึงสิ่งนี้คือการสร้างเมธอดใหม่ที่มีชื่อเหมือนกับget_parentSpecies()
ที่เรียกว่าเมธอดหลัก:
function get_parentSpecies(){
parent::get_species();
}
อีกครั้งสิ่งนี้ช่วยให้ทุกอย่างดีและสอดคล้องกันโดยอนุญาตให้มีการเปลี่ยนแปลง / แก้ไขวิธีการเฉพาะที่แทนที่จะอาศัยวิธีการหลัก
$leg = new leg()
ภายในhuman
ฉันจะเรียกฟังก์ชันของมนุษย์จากภายในอินสแตนซ์ขาได้$leg
อย่างไร