A和B的功能具有相同的签名 - 让我们假设:foo($arg)
- 和class A extends B
。
现在我有一个实例:
$a = new A();
$a.foo($data);
我是否可以通过foo()
运行父级(B)$a
功能,还是覆盖了它?
谢谢! NIMI
答案 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的对象,那么您可能需要查看Decorator或Strategy模式。
如果您开始使用面向对象编程,我不能足够推荐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获得结果,你可能想要解释你的困境;这是一个你不应该遇到的问题,如果你这样做,设计的可能性就不大了。