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

时间:2015-10-27 18:18:50

标签: php oop inheritance abstract-class

我有一个扩展抽象类的类。 PHP允许从抽象方法中访问扩展类的实例吗?

像这样的东西:     

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

其中$ barClassInstance将保存Bar类实例,而不是抽象的Foo实例?

1 个答案:

答案 0 :(得分:3)

尝试它是值得一千个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指向已创建的特定子类。