我有以下内容:
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,没有任何方法覆盖在整个过程中发生。
答案 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) );
答案 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类值。