使用相同签名/名称调用父函数
A和B具有相同签名的功能 - 让我们假设:foo($arg)
- 和class A extends B
。使用相同签名/名称调用父函数
现在我有一个实例:
$a = new A();
$a.foo($data);
可我还通过$a
运行父(B的)foo()
功能还是被它覆盖?
谢谢! Nimi敬上
它被覆盖,但如果你想同时使用,你可以这样做:
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
您可以通过parent::foo()
访问父母方法
在A类,你可以写
parent::foo($param);
调用基类FOO(...)方法。
.
是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
可我还通过$一个运行父母的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有结果,你可能想解释你的困境;这是一个你不应该遇到的问题,如果你这样做,设计的可能性并不是最佳的。
'$ b'在你的例子中来自哪里? – knittl
Ehr,好,错字发生:)相应地编辑示例。 –
回答你的问题,不,你不能通过类A的对象调用父类的foo()方法作为对象A在其公共API中理解的唯一的foo()方法,它自己的foo()方法。你可能需要考虑你的设计。如果B的foo()为A的foo()提供了不同的功能,那么是否应该覆盖另一个?或者你需要考虑A的foo()通过parent :: foo()调用B的foo() - 假设每次调用A的foo()时都要调用B的foo()。或者使用其他模式。如果A的foo()并不总是适合A的对象,那么您可能需要查看Decorator或Strategy patttern。
如果你开始使用面向对象编程,我不能推荐Gang of Four book足够高。
感谢您的快速响应。这种方法很明显,但有什么办法可以从外部类访问foo()而不生成B对象吗? – Nimi