簡體   English   中英

在子 class 中擴展時如何調用父 class 函數

[英]How to call parent class functions when extending in child class

下面是我給出的示例代碼

<?php
Class A {
    function SelectRecord()
    {
        $this->DeleteRecord();
        echo "class A - SelectRecord ";
    }
    function DeleteRecord()
    {
        echo "class A - DeleteRecord ";
    }
}

Class B extends a {
    function SelectRecord()
    {
        Parent::SelectRecord();
        echo "class B - SelectRecord ";
    }
    function DeleteRecord()
    {
        echo "class B - DeleteRecord ";
    }
}

$objB = new B();
$objB->SelectRecord();

Output 我得到的是

class B - DeleteRecord 
class A - SelectRecord 
class B - SelectRecord

How can I call the class A DeleteRecord method in class A itself when extending in Class B. When I tried to call from Class A it calls the Class B DeleteRecord method. 當我使用 self::DeleteRecord。 它工作正常。 但是什么時候 $this 和 Self. 我應該將 $this 替換為 Self 嗎?

您可以為正在調用的方法指定確切的 class:

    <?php
    Class A {
        function SelectRecord()
        {
            A::DeleteRecord();
            echo "class A - SelectRecord ";
        }
        function DeleteRecord()
        {
            echo "class A - DeleteRecord ";
        }
    }

    Class B extends a {
        function SelectRecord()
        {
            Parent::SelectRecord();
            echo "class B - SelectRecord ";
        }
        function DeleteRecord()
        {
            echo "class B - DeleteRecord ";
        }
    }

    $objB = new B();
    $objB->SelectRecord();

結果

class A - DeleteRecord 
class A - SelectRecord 
class B - SelectRecord 

解釋和延伸閱讀:

導致調用派生類方法的機制稱為虛擬方法 它用於促進 多態性 PHP 中的所有方法默認都是虛擬的。 您可以通過關鍵字“final”來防止方法被覆蓋標記它。

據我了解,你們的課程並沒有試圖解決任何實際問題,這只是一個語言學習練習。 在 Joshua Bloch 的有效 Java中有一個關於使用 inheritance 的很好的指南:

Inheritance 僅適用於子類確實是超類的子類型的情況。 換句話說,只有當兩個類之間存在“is-a”關系時,class B 才應該擴展 class A。 如果您想擁有一個 class B 擴展一個 class A,問自己一個問題:每個 B 真的都是 A 嗎? 如果你不能如實回答這個問題,B不應該擴展A。如果答案是否定的,通常情況下B應該包含A的私有實例並暴露一個更小更簡單的API:A不是必不可少的部分B,只是其實現的一個細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM