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

Posted

技术标签:

【中文标题】如果父类中不存在,则调用子类函数【英文标题】:Calling a child class function if not exist in parent class 【发布时间】:2017-04-25 12:49:33 【问题描述】:

我有如下代码---

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()。

但无论如何它正在调用父类函数,因为它是从父类的构造函数中调用的,而与子类/上下文无关:(

【问题讨论】:

重复? ***.com/questions/1944827/… 听起来像 xy problem 对我来说 protected function f 可以在 CartItem 的构造函数中被调用 m 被实例化。 @modsfabio,不是重复的,而是相反的场景 @TusharSharma,怎么样?我在找这样的东西 【参考方案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
    

【讨论】:

我刚刚完成了 :) 无论如何谢谢。但是另一个层次的复杂性,我不希望它是抽象的,如果子类定义了它然后获取子类的函数或从父类本身获取它 我不明白你。您可以在基类中定义方法,并在需要时在子类中重新定义。 $this->f() 总是调用正确的实现(子类之一,如果存在,则基类之一)。如果您没有在基类中定义方法f(),那么正确的实现是使其抽象,因为无论如何它都无法实例化。您可以在基类中保留 f() 未定义(而不是使类抽象)并在调用它之前使用 method_exists() 但这是一个 hack。 我已经修改了问题 只是好奇:__construct() 被调用了吗?声明 var $v;php 4 语法。 PHP 5 uses the PHP 4 object model when it encounters var 在类声明中。但是 PHP 4 不关心__construct();它不是构造函数,而是 PHP 4 中的常规函数​​。阅读有关 PHP classes and objects 的更多信息并摆脱 var。我希望你没有使用 PHP 4,顺便说一句。【参考方案2】:

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

所以,据我了解,您是在问(如果这不对,请说):

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

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

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

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 是编译的,它会在运行时知道这两个类,因此能够弄清楚我们想要它做什么。

因此,进一步说,您想使用变量。是的,你可以,但它们也必须是静态的。

working example

【讨论】:

你已经得到了,正是我想要做的,但如果我定义了那个静态,那意味着我将无法获得任何类属性:( 静态方法只是一个名称很时髦的全局函数。 @Alice 如果你不能有一个静态,那么不,你不能这样做。

以上是关于如果父类中不存在,则调用子类函数的主要内容,如果未能解决你的问题,请参考以下文章

面向对象总结

请教,父类中如何调用子类中的虚函数

lombok在继承类上的使用

多态的理解

在php中,子类extends继承了父类,当子类和父类同时存在构造函数__construct先执行哪一个呢?

java中私有的属性、静态成员可以被子类继承吗?