php 设置静态数组,php – 数组的静态继承

我很难解释我想要做的事情,所以我只是举个例子

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'];

}

如果顺序很重要,那么更改合并参数顺序(现在它就像它在类层次结构链中一样 – 从子级到父级)

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

)

);

}

}

演示here.这是更短的方式.因此可以使用普通数组映射完成.不幸的是,必须手动将当前类添加到迭代层次结构数组中.

标签:php,oop,inheritance

来源: https://codeday.me/bug/20190824/1709015.html