遍历类树而不覆盖方法?

时间:2012-05-25 13:50:14

标签: php inheritance overloading

我有以下内容:

class A
{
    public function getDependencies()
    {
        //returns A.default.css, A.default.js, A.tablet.css, A.tablet.js, etc,
        //depending on what files exist and what the user's device is.
    }
}

在扩展A的B类中,如果我调用getDependencies,我会得到类似的东西:B.default.css,B.default.js等等。

我现在要做的是包括A的结果,而不必覆盖B中的getDependencies()。事实上,我甚至不确定覆盖是否会起作用。这可能吗?

这适用于模板的动态CSS / JS加载,也适用于生产的编译。

EDIT =我应该指出getDependencies返回的是动态生成的,而不是一组存储的值。

EDIT2 =我的想法是,只是继承自A将提供行为。我可能需要通过层次结构树进行某种递归,从B开始,到B的父级,一直到A,没有任何方法覆盖在整个过程中发生。

3 个答案:

答案 0 :(得分:2)

使用parent::getDependencies(),例如:

class B
{
  public function getDependencies()
  {
    $deps = array('B.style.js' 'B.default.js', 'B.tables.js' /*, ... */);
    // merge the dependencies of A and B
    return array_merge($deps, parent::getDependencies());
  }
}

您还可以尝试使用ReflectionClass的代码来迭代所有父母:

<?php

class A
{
  protected static $deps = array('A.default.js', 'A.tablet.js');
  public function getDependencies($class)
  {
    $deps = array();

    $parent = new ReflectionClass($this);

    do 
    {
      // ReflectionClass::getStaticPropertyValue() always throws ReflectionException with
      // message "Class [class] does not have a property named deps"
      // So I'm using ReflectionClass::getStaticProperties()

      $staticProps = $parent->getStaticProperties();
      $deps = array_merge($deps, $staticProps['deps']);
    }
    while ($parent=$parent->getParentClass());

    return $deps;
  }
}
class B extends A
{
  protected static $deps = array('B.default.js');
}

class C extends B
{
  protected static $deps = array('C.default.js');
}

$obj = new C();
var_dump( $obj->getDependencies($obj) );

On Ideone.com

答案 1 :(得分:1)

使用反射API非常简单。

我可以简单地遍历父类:

$class = new \ReflectionClass(get_class($this));
while ($parent = $class->getParentClass()) 
{
        $parent_name = $parent->getName();
        // add dependencies using parent name.
        $class = $parent;
}

致ComFreek的信誉,他把我指向了正确的地方。

答案 2 :(得分:0)

您可以使用self关键字 - 这将返回A类值,然后您可以使用$ this来获取B类值。