如果父类中不存在,则调用子类函数

时间:2017-04-25 12:49:34

标签: php 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()。

但无论如何它调用父类函数,因为它是从父的构造函数调用的,不管子类/上下文:(

2 个答案:

答案 0 :(得分:1)

您希望在__construct()中调用未在类中定义的方法。这表明CartItem类是一个抽象概念而您并不打算实例化它(因为CartItem的实例可能不包含足够的信息或行为项目)。

抽象概念是使用abstract class实现的,它尽可能地定义,并定义要在扩展它的具体类中实现的抽象方法。方法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
    }
}

答案 1 :(得分:0)

这实际上是一个非常有趣的问题。

所以,据我所知,你问(如果这不对,请说):

  

你可以调用一个扩展父母的类的功能吗?

是的,如果孩子中的方法是静态的,你可以......那样。

举个例子(为了简单起见,我没有在构造函数中使用它,但它也可以在那里工作):

public function beforeAction($action)
{
    //your code

    if (Yii::$app->getRequest()->getMethod() === 'OPTIONS') {
        parent::beforeAction($action);
        Yii::$app->getResponse()->getHeaders()->set('Content-Type', 'text/plain');
        Yii::$app->end();
    }

    return parent::beforeAction($action);
}

这个工作的原因需要更多的研究,但我想说,因为PHP是编译的,它会在运行时知道这两个类,因此能够弄清楚我们想要它做什么。 / p>

所以,进一步说,你想要使用变量。是的,你可以,但他们也必须是静态的。

working example