PHP中的parent :: parent

Ale*_*dre 42 php oop parent

我搜索一种方法来访问一个类的父,父函数而不调用父...嗯,这听起来有点奇怪的解释所以我将举一个例子:

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答案.

  • 为此:myclass::test(),该方法不应该定义为`static`吗? (3认同)
  • @Alexandre我猜你在尝试扩展Magento Grid类中的_prepareCollection()函数时遇到了这个问题.我只是想同意,Magento的开发人员遵循的逻辑很差,没有考虑人们是否想扩展他们的功能.他们应该在每个函数的顶部包含这个:$ collection = $ this-> getCollection(); if(is_null($ collection)){$ collection = Mage :: getResourceModel('identifier/name'); } (2认同)
  • @MagePsycho不,这只是奇怪的PHP古怪.它看起来像一个静态方法,但它实际上是非静态地调用它.请不要使用此模式,因为它会在重构时导致混淆. (2认同)

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)

但是,这可能不是一个好主意,取决于你想要实现的目标.

  • 完全从这篇文章使用代码测试后,代码工作.如果`$ class`是一个字符串,我永远不会知道`$ class :: method`.但是我不同意你的意见,如果代码不起作用,我应该开一个新帖子,因为你可能在帖子中犯了错误,我的评论可能会帮助你纠正错误.无论如何,谢谢你的解释. (3认同)

Los*_*can 5

也许您可以将 myclass2 添加为 myclass3 中的成员对象,然后尝试编写如下代码:

class myclass3{
myclass2 obj2;
public function test() { return $obj2->callParentTest() . '-level3';}
}
Run Code Online (Sandbox Code Playgroud)