如何从当前类调用方法的实现?

时间:2017-03-20 13:02:36

标签: php class oop

我有一个像

这样的课程
class Base
{
    public function greet()
    {
        print "hello";
    }

    public function speak()
    {
        $this->greet();
    }
}

和类似的

class Extension extends Base
{
    public function greet()
    {
        print "goodbye";
    }
}

我有这段代码:

$extension = new Extension();

//Situation One
$extension->speak(); //This says goodbye

//Situation Two
$extension->greet(); //This says goodbye

我希望情况一开口打招呼。我很高兴情况二说再见。

我能做些什么(大概是在speak()的实现中)来表明必须使用Base中greet()的实现吗?

(换句话说,Base很高兴扩展类覆盖greet()但是当speak()调用greet()时,它希望它使用Base中定义的已知行为,而不是其他地方定义的未知行为。)

2 个答案:

答案 0 :(得分:0)

由于您在不同情况下需要不同的功能,因此请创建两个类实现。

class Base
{
    public function greet()
    {
        print NULL;
    }

    public function speak()
    {
        this->greet();
    }
}

class Goodbye extends Base
{
    public function greet()
    {
        print "goodbye";
    }
}

class Hello extends Base
{
    public function greet()
    {
        print "hello";
    }
}

一种情况。

$hello = new Hello();
$hello->greet();

另一种情况。

$goodbye = new Goodbye();
$goodby->greet();

答案 1 :(得分:0)

这是向接口介绍自己的完美场景。在这种特殊情况下,您需要以下界面:

interface MyClassInterface
{
    public function greet();

    public function speak();
}

如果您不想覆盖它,请不要在speak方法中调用问候语:

abstract class Base
{
    public function speak()
    {
        print "hello";
    }
}

class Extension extends Base implements MyClassInterface
{
    public function greet()
    {
        print "goodbye";
    }
}

$extension = new Extension();

// Situation One
$extension->speak(); // This says hello

// Situation Two
$extension->greet(); // This says goodbye