2011-11-16 40 views
2

A和B具有相同签名的功能 - 让我们假设:foo($arg) - 和class A extends B使用相同签名/名称调用父函数

现在我有一个实例:

$a = new A(); 

$a.foo($data); 

可我还通过$a运行父(B的)foo()功能还是被它覆盖?

谢谢! Nimi敬上

回答

4

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

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

+0

感谢您的快速响应。这种方法很明显,但有什么办法可以从外部类访问foo()而不生成B对象吗? – Nimi

0

您可以通过parent::foo()访问父母方法

0

在A类,你可以写

parent::foo($param); 

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

5

.是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 
0

可我还通过$一个运行父母的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->通话输出A ::通话(),比进行代理,通过B.其他如果您需要从的,而不是B有结果,你可能想解释你的困境;这是一个你不应该遇到的问题,如果你这样做,设计的可能性并不是最佳的。

+0

'$ b'在你的例子中来自哪里? – knittl

+0

Ehr,好,错字发生:)相应地编辑示例。 –

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 patttern。

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

相关问题