簡體   English   中英

如果父類中不存在子類,則調用子類函數

[英]Calling a child class function if not exist in parent class

我有一個類似下面的代碼-

class CartItem{
    var $v;
    function __construct(){
        $this->f();
    }
    function f(){
         echo 'In parent';
    }
}

class m extends CartItem{
    function f(){
        echo 'In child';
    }
}

new m();

現在,當創建m()的實例時...它沒有任何構造函數,因此它正在調用父類的構造函數。 現在在其中調用了函數f。

我想要的是-如果類m()具有定義的函數f()...,則應調用它而不是父類的函數f()。

但是無論如何,它都在調用父類函數,就像從父類的構造函數中調用的那樣,而與子類/上下文無關:(

您想在__construct()調用該類中未定義的方法。 這表明CartItem類是一個抽象概念,您不打算實例化它(因為CartItem的實例可能不包含項目的足夠信息或行為)。

使用一個抽象類來實現一個抽象概念 ,該抽象類定義了盡可能多的抽象類 ,並定義了在擴展它的具體類中實現的抽象方法。 方法f()是無法在抽象概念中定義的方法,而必須在擴展它的每個類中定義:

abstract class CartItem
{
    public function __construct()
    {
        $this->f();
    }

    abstract protected function f();
}

class m extends CartItem
{
    protected function f()
    {
        // Implement behaviour specific to this class
    }
}

這實際上是一個非常有趣的問題。

因此,據我所知,您是在問( 如果這樣不對,請說 ):

您可以調用擴展父類的類的函數嗎?

是的,如果孩子中的方法是靜態的,則可以...

以這個例子為例(為了簡化示例,我沒有在構造函數中使用它,但是它也可以在其中使用):

class ClassA {

    public function testMeAsWell() {
        return ClassB::testMe();
    }
}

class ClassB extends ClassA {

    static function testMe() {
        return 'do something';
    }
}

$child = new ClassB();
echo $child->testMe();

// outputs 'do something'


$parent = new ClassA();
echo $parent->testMeAsWell();

// also outputs 'do something'

這項工作的原因需要更多的研究,但是我猜想是因為PHP是編譯的,因此它將在運行時了解這兩個類,因此可以弄清楚我們希望它做什么。

因此,進一步,您想使用變量。 是的,您可以,但是它們也必須是靜態的。

工作實例

暫無
暫無

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

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