我搜索一种方法来访问一个类的父,父函数而不调用父...嗯,这听起来有点奇怪的解释所以我将举一个例子:
class myclass
{
public function test() { return 'level 1'; }
}
class myclass2 extends myclass
{
public function test() { return parent::test() . '-level 2'; }
}
class myclass3 extends myclass2
{
public function test() { return parent::test() . '-level 3'; }
}
$example = new myclass3();
echo $example->test(); // should display "level 1-level 2-level 3"
Run Code Online (Sandbox Code Playgroud)
我想显示"1级3级",然后做类似的事情:
class myclass3 extends myclass2
{
public function test() { return parent::parent::test() . '-level 3'; }
}
Run Code Online (Sandbox Code Playgroud)
你知道我怎么做吗?(我不允许编辑myclass和myclass2,它们是框架的一部分...)
PiT*_*ber 59
简单解决方案 直接使用根对象myclass:
class myclass3 extends myclass2
{
public function test() { return myclass::test() . '-level 3'; }
}
Run Code Online (Sandbox Code Playgroud)
如果您需要更通用的方法,请查看outis答案.
out*_*tis 23
你可以用它来做 get_parent_class
function get_grandparent_class($thing) {
if (is_object($thing)) {
$thing = get_class($thing);
}
return get_parent_class(get_parent_class($thing));
}
class myclass3 extends myclass2 {
public function test() {
$grandparent = get_grandparent_class($this);
return $grandparent::test() . '-level 3';
}
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用反射:
function get_grandparent_class($thing) {
if (is_object($thing)) {
$thing = get_class($thing);
}
$class = new ReflectionClass($thing);
return $class->getParentClass()->getParentClass()->getName();
}
Run Code Online (Sandbox Code Playgroud)
但是,这可能不是一个好主意,取决于你想要实现的目标.
也许您可以将 myclass2 添加为 myclass3 中的成员对象,然后尝试编写如下代码:
class myclass3{
myclass2 obj2;
public function test() { return $obj2->callParentTest() . '-level3';}
}
Run Code Online (Sandbox Code Playgroud)