我很难解释我想要做的事情,所以我只是举个例子
class A {
static $data = ['a'];
static function getData() { return static::$data; }
}
class B extends A {
static $data = ['b'];
}
class C extends B {
static $data = ['c'];
}
class D extends B {
static $data = ['d'];
}
$a = new A;
$b = new B;
$c = new C;
$d = new D;
$a::getData(); // Output: Array('a'), Expected: Array('a');
$b::getData(); // Output: Array('b'), Expected: Array('a', 'b');
$c::getData(); // Output: Array('c'), Expected: Array('a', 'b', 'c');
$c::getData(); // Output: Array('d'), Expected: Array('a', 'b', 'd');
这有可能吗?
编辑:我有我的数据对象,每个对象都有一套属性规则.例如,User对象的属性名称最多可以包含10个符号,我在用户类的规则中对此进行定义,然后所有用户对象在其属性名称即将更改时将遵循该规则. rules数组是静态的,因为它们适用于此类的所有对象.但是,当我在VIP用户中继承它时,VIP将需要具有基本用户没有的属性的附加规则.我需要能够扩展规则数组,但如果我在子类中定义这样的数组,它只会覆盖我也需要的父规则.
解决方法:
class A
{
public static $data = ['a'];
public static function getData()
{
$result = static::$data;
$class = get_called_class();
while ($class = get_parent_class($class)) {
$result = array_merge($result, $class::$data);
}
return $result;
}
}
class B extends A
{
public static $data = ['b'];
}
class C extends B
{
public static $data = ['c'];
}
class D extends C
{
public static $data = ['d'];
}
演示here.
如果顺序很重要,那么更改合并参数顺序(现在它就像它在类层次结构链中一样 – 从子级到父级)
或者,使用class_parents()
class A
{
public static $data = ['a'];
public static function getData()
{
$classes = [get_called_class()]; //no class with name "0"
$classes += class_parents($classes[0]);
return call_user_func_array('array_merge',
array_map(
function($class) {
return $class::$data;
},
$classes
)
);
}
}