【问题标题】:How to call parent class functions when extending in child class在子类中扩展时如何调用父类函数
【发布时间】:2020-08-10 21:21:51
【问题描述】:

下面是我给出的示例代码

<?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();

我得到的输出是

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

在 B 类中扩展时,如何在 A 类本身中调用 A 类 DeleteRecord 方法。当我尝试从 A 类调用时,它会调用 B 类 DeleteRecord方法。当我使用 self::DeleteRecord。它工作正常。但是什么时候 $this 和 Self.我应该将 $this 替换为 Self 吗?

【问题讨论】:

  • 不确定stackoverflow.com/questions/151969/when-to-use-self-over-this 是否回答了您的问题。
  • 这能回答你的问题吗? When to use self over $this?
  • 我的不是静态函数。那么如何使用Self。我的问题是我使用 $this 来调用。但是当方法名称相同时,它会调用子类函数。我希望调用父类 A 函数。如何做到这一点
  • 没错,你的不是静态方法。所以你不使用自我,你使用$this。如果您想调用父类,请使用parent::method(),就像您在问题中所做的那样。
  • @yivi 当我从 A 类(父类)调用删除记录 $this->DeleteRecord() 时,它调用 B 类(子类)DeleteRecord 函数而不是 A 类。因为我从A类,它应该调用同一个类中的方法。但它调用了派生类函数。如果方法名称相同,就会出现这种混乱。如何解决这个问题。

标签: php class oop inheritance


【解决方案1】:

您可以为被调用的方法指定确切的类:

    <?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 

解释和延伸阅读:

导致调用派生类方法的机制称为virtual method。用于方便polymorphism。 PHP 中的所有方法默认都是虚拟的。您可以通过关键字“final”来防止方法被覆盖标记它。

据我了解,你们的课程并没有试图解决任何实际问题,这只是一个语言学习练习。 Joshua Bloch 的Effective Java 中有一个很好的使用继承指南:

继承只适用于子类的情况 确实是超类的子类型。换句话说,B类 仅当两者之间存在“is-a”关系时才应扩展 A 类 两个班级。如果你想让 B 类扩展一个类 A,问自己一个问题:每个 B 真的都是 A 吗?如果你不能 如实回答这个问题是,B不应该扩展A。如果 答案是否定的,通常情况下 B 应该包含一个私有的 A 的实例并公开一个更小更简单的 API:A 不是 B 的基本部分,只是其实现的一个细节。

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多