假设base
和son
类都有方法method_1
,
还有method_2
的另一种base
方法。
在base::method_2
内,无论$this->method_1
是base::method_1
还是$this
的实例,我如何将base
指向son
?< / p>
答案 0 :(得分:1)
如果我理解正确,你需要这样的东西:
<?php
class base {
public function method1() {
echo "base:method1\n";
}
public function method2() {
if(get_class($this) == 'base') {
$this->method1();
}
else {
parent::method1();
}
echo "base:method2\n";
}
}
class son extends base {
public function method1() {
echo "son:method1\n";
}
}
$obj = new son();
$obj->method2();
其中对method2的调用将始终使用method1的基本版本。
我能做到的最好的方法如上所述,但是这个代码不起作用,因为base没有父代。我很确定你想做的事情是不可能的。
这是你会得到的错误:
PHP Fatal error: Cannot access parent:: when current class scope has no parent in
答案 1 :(得分:1)
这将做你想要的。代码示例代码的道具(即使他没有完成工作)。
<?php
class base {
public function method1() {
echo "base::method1\n";
}
public function method2() {
if (get_parent_class($this) === FALSE) {
echo get_class($this)." has no parent\n";
$this->method1();
} else {
echo get_class($this)." has parent\n";
call_user_func(array(get_parent_class($this), 'method1'));
}
}
}
class son extends base {
public function method1() {
echo "son::method1\n";
}
}
$b = new base();
$b->method2();
$s = new son();
$s->method2();
?>
输出:
base has no parent
base::method1
son has parent
base::method1
答案 2 :(得分:0)
将该功能设为私有:
<?php
class A
{
public function __construct()
{
$this->foo();
$this->bar();
}
private function foo() { echo "A::foo()\n"; }
public function bar() { echo "A::bar()\n"; }
}
class B extends A
{
public function foo() { echo "B::foo()\n"; }
public function bar() { echo "B::bar()\n"; }
}
new B();
?>
输出结果为:
A::foo()
B::bar()
答案 3 :(得分:0)
是的。这是单数(一个父母)。
son->method_1
可以添加或覆盖所有base->method_1
功能。
son->method_1
可以简单地添加一个额外的功能,并利用它的父实例method_1
的其余功能
所以调用$this->method_1
会使用base->method_1
和son->method_1
,只要你想在base中使用的内容不会在子代中被覆盖。
答案 4 :(得分:0)
如果调用子类中不存在的方法,PHP将遍历类层次结构,直到找到实现所需函数的祖先类。这意味着如果您的son
类没有实现method_2
,PHP将自动查找最近的祖先。{在您的情况下,它会根据您的需要调用method_2
base
。
如果您 覆盖了method_2
课程中的son
,并且您想要自己实施method_2
,并且还要调用base::method_2
实施然后您可以使用parent
关键字:
class son extends base {
public function method_2() {
parent::method_2();
//do son::method_2()-specific stuff here
}
}
您无法将parent
个调用链接在一起,因此如果base
是GrandparentClass
的子类,则您无法执行以下操作:
parent::parent::method_2(); // trying to call grandparent::method_2
// but this call will fail
但是你可以按名称直接引用祖先类,所以这可以工作:
GrandparentClass::method_2();
只是为了更进一步,还有一个名为class_parents()
的函数,它返回一个类继承的每个祖先类的数组。如果你想回去,比如说两个祖先,但由于某些原因你不知道它的具体名称,你可以使用eval()
调用该函数。
例如,此代码将调用GrandparentClass::method_2()
而不直接在代码中引用类名称:
$parents = class_parents($this);
eval(end($parents) . "::method_2();");
希望有所帮助。