使用相同的签名/名称调用父函数

时间:2011-11-16 08:06:08

标签: php oop inheritance extends

A和B的功能具有相同的签名 - 让我们假设:foo($arg) - 和class A extends B

现在我有一个实例:

$a = new A();

$a.foo($data);

我是否可以通过foo()运行父级(B)$a功能,还是覆盖了它?

谢谢! NIMI

6 个答案:

答案 0 :(得分:7)

.是PHP中的字符串连接运算符。要调用方法,请使用->

要调用重写方法,请使用parent::method()

class B {
  public function foo($data) {
    echo 'B';
  }
}

class A extends B{
  public function foo($data) {
    parent::foo($data);
    echo 'A';
  }
}

$a = new A();
$a->foo($data); // BA
$b = new B();
$b->foo($data); // B

答案 1 :(得分:5)

它被覆盖但如果你想同时使用它们,你可以这样做:

function parentFoo($arg)
{
    return parent::foo($arg);
}

如果你想让子函数调用父函数,请执行以下操作:

function foo($arg)
{
    $result = parent::foo($arg);
    // Do whatever you want
}

有关详细信息,请参阅此网址:http://php.net/manual/en/keyword.parent.php

答案 2 :(得分:1)

回答你的问题,不,你不能通过类A的对象调用父的foo()方法作为对象A在其公共API中理解的唯一foo()方法是它自己的foo()方法。您可能需要考虑您的设计。如果B的foo()为A的foo()提供不同的功能,那么应该覆盖另一个吗?或者你需要考虑A的foo()通过parent :: foo()调用B的foo() - 假设你想要在每次调用A的foo()时调用B的foo()。或者使用其他模式。如果A的foo()并不总是适合A的对象,那么您可能需要查看DecoratorStrategy模式。

如果您开始使用面向对象编程,我不能足够推荐Gang of Four book

答案 3 :(得分:0)

您可以使用parent::foo()

访问父方法

答案 4 :(得分:0)

在A班你可以写

parent::foo($param);

调用基类foo(...)方法。

答案 5 :(得分:0)

  

我还可以通过$ a运行父级的foo()函数,还是覆盖?

不是来自“外面”。说:

<?php
class A {
    function talk( ) {
        return 'Hello world';
    }
}
class B extends A {
    function talk( ) {
        return 'Goodbye world';
    }
}

$b = new B;
$b->talk( ); // Goodbye world.

在这个例子中,除了通过B代理之外,不可能有$ b-&gt; talk输出A :: talk(),如果你需要从A而不是B获得结果,你可能想要解释你的困境;这是一个你不应该遇到的问题,如果你这样做,设计的可能性就不大了。