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

Php 如果父类中不存在子类函数,则调用子类函数,php,class,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的实例时。。。它

我有如下代码--

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。。。is应该调用它,而不是父类的函数f


但不管怎样,它调用的是父类函数,就像从父类的构造函数调用的一样,与子类/上下文无关:

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

所以,据我所知,你在问这是否正确,请说:

可以调用扩展父类的类的函数吗

是的,你可以。。。在某种程度上,如果子对象中的方法是静态的

以这个例子为例,为了简单起见,我没有在构造器中使用它,但它也可以在那里使用:

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是编译的,所以它在运行时将了解这两个类,因此将能够了解我们希望它做什么

所以,进一步说,您希望使用变量。可以,但它们也必须是静态的

您想在_中调用未在类中定义的方法。这表明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
    }
}

复制听起来像是当m被实例化时,可以在CartItem的构造函数中调用to-meprotected函数f。@modsfabio,不是重复的,而是相反的scenario@TusharSharma怎么样,伙计?我在寻找这样一个东西,你有,正是我想做的,但如果我定义了静态,这意味着我将无法定义任何类属性:静态方法只是一个具有时髦名称的全局函数。@Alice如果你不能有静态,那么不,你就不能这样做。我现在已经这样做了:无论如何,谢谢。但另一个层次的复杂性,我不希望它是抽象的,若子类定义了它,那个么就接受子类的函数,或者从父类本身获取它,我不明白。您可以在基类中定义方法,并在需要时在子类中重新定义它$此->f始终调用正确的实现子类的实现,如果存在,则调用基类的实现,否则调用基类的实现。如果没有在基类中定义方法f,那么正确的实现是将其抽象,因为它无论如何都无法实例化。您可以在基类中不定义f,也可以在调用它之前不使该类抽象和使用,但这是一种攻击。我修改了这个问题只是出于好奇:是否调用了u构造?声明var$v;是PHP4语法。PHP5在一个类声明中。但是PHP4不关心_构造;它不是构造函数,而是PHP4中的常规函数。阅读更多关于和摆脱var的内容。顺便说一句,我希望您没有使用PHP4。