当前位置: 首页 > 知识库问答 >
问题:

在PHP中从抽象方法返回扩展类实例

侯池暝
2023-03-14
abstract class Foo{
    protected function bar(){
        return $this;
    }
}

class Bar extends Foo{
    public function foo(){
        // this should hold Bar instance and not Foo's
        $barClassInstance = $this->bar();
    }
}

共有1个答案

闻人仲渊
2023-03-14

尝试它胜过一千个stackoverflow问题

<?php

abstract class Foo{
    protected function bar(){
        echo 'Foo', PHP_EOL;
        var_dump($this);
        return $this;
    }
}

class Bar extends Foo{
    public function foo(){
        echo 'Bar', PHP_EOL;
        var_dump($this);
        // this should hold Bar instance and not Foo's
        $barClassInstance = $this->bar();
        var_dump($barClassInstance);
    }
}

$bar = new Bar();
$bar->foo();

输出https://3v4l.org/b73bt

Bar
object(Bar)#1 (0) {
}
Foo
object(Bar)#1 (0) {
}
object(Bar)#1 (0) {
}

$this是对实例的引用,而不管它实际上是哪个子类的实例。没有foo实例,因为foo不能实例化,它是抽象的。即使foo是一个具体的类,在同一个对象中也不会有foo$thisbar$this。只有$this指向创建的特定子类。

 类似资料:
  • 我在想有没有更好的办法。我想要的是在抽象类中有一个具体的方法,返回扩展抽象类的具体实例。 我认为我不应该把它转换成T,因为它总是T的一个实例。

  • 类和的行为有何不同?我为什么要选择其中一个? (目前,TypeScript手册和语言规范不包括抽象类。)

  • 本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面

  • 问题内容: 有这样的事情: 抽象类: 和扩展器: 我想要的是扩展,因为如果不处理它,然后尝试在中处理它。例如add- 但同时让类处理默认值,例如。 这是完全错误的方法吗? 到目前为止,我所做的就是添加一个接口。通常: 在课堂上: 在课堂上: 这看起来像是可用的设计吗? 并且,主要问题: 有没有什么好办法扩展该类,以便可以使用与in 中相同的切换方法?我想知道的是,有没有一个更好的设计,第二个是是否

  • 问题内容: 我正在查看Java 8接口中的新虚拟扩展方法: 我的目的是允许接口随着时间的推移以及多重继承的发展而演变,但是在我看来,它们看上去非常像抽象类。 如果您要进行新工作,则是使用抽象类而不是扩展方法来为“接口”提供实现,或者这两种方法在概念上是否等效? 问题答案: 这种构造的主要目的是保持向后兼容性。在Java语言中添加闭包是一个重大的更改,需要对其进行更新以充分利用此功能。例如,在Jav

  • 本文向大家介绍C#扩展抽象基类,包括了C#扩展抽象基类的使用技巧和注意事项,需要的朋友参考一下 示例 与接口(可以描述为实现合同)不同,抽象类充当扩展的合同。 抽象类无法实例化,必须对其进行扩展,然后可以实例化生成的类(或派生类)。 抽象类用于提供通用实现 上面的示例显示了实现Car的任何扩展类如何自动接收HonkHorn方法。这意味着任何开发新汽车的开发人员都无需担心它将如何鸣笛。