0

我有以下内容:

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,在此过程中不会发生任何方法覆盖。

4

3 回答 3

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) );

在 Ideone.com 上

于 2012-05-25T14:03:05.853 回答
1

使用反射 API 非常简单。

我可以简单地遍历父类:

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

感谢 ComFreek,他为我指出了正确的地方。

于 2012-05-25T15:07:46.837 回答
0

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

于 2012-05-25T13:58:00.580 回答