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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值