0

给定以下类结构:

class Foo {
    protected static $_things = ['thing'];
}

class Bar extends Foo {
    protected static $_things = [
        'thing', 'other-thing'
    ];
}

class Baz extends Bar {
    protected static $_things = [
        'thing', 'other-thing', 'something-else'
    ];
}

class Quux extends Baz {
    // Note the lack of "other-thing"
    protected static $_things = [
        'thing', 'something-else', 'one-more'
    ];
}

重构这个并保持数组元素更干燥的最佳方法是什么?例如,“thing”元素应该只定义一次(in Foo),“other-thing”元素应该只定义一次(in Bar),等等。

在实践中,这个数组非常大,有时最多可以有 4 或 5 级继承,每个都需要以某种特殊的方式“修改”这个数组,无论是添加还是删除元素。

我一直在玩弄可以进行适当修改的初始化方法的想法,但想先看看是否有更好的方法。

4

3 回答 3

2

我能想到的最简单的解决方案(主要基于单例模式)。

我认为没有任何编译时方法可以做你正在寻找的东西。

<?php
class A {
    private static $a = [1, 2, 3];
    public static function getA() {
        return self::$a;
    }
}

class B extends A {
    private static $a = null;
    public static function getA() {
        if (self::$a === null)
            self::$a = array_merge(A::getA(), [4, 5, 6]);
        return self::$a;
    }
}

echo join(',', B::getA()) . "\n";
于 2012-11-16T03:08:45.447 回答
0

判断不完全了解用例有点困难,但继承似乎是错误的方法。无论如何,您需要将数据的存储方式和访问方式分开,即将数据结构与数据模型分开。

最好的解决方案是创建一个单独的列表类并在多个客户端中使用它。例如:

class SomeList{
    private $_things = ['thing'];
    function mergeItems( $items ){
        //merge the $this->_things and $items arrays uniquely
        //...
    }
}

class Foo{
    private $list;

    function __construct( $list ){
        $this->list = $list;
        $this->list->mergeItems( ['thing', 'other-thing'] );
    }
}

您永远不应该将状态存储在静态属性中

于 2012-11-16T16:51:26.863 回答
-1

也许这样的事情会起作用:

class Foo {
    protected static $_things = ['thing'];
}

class Bar extends Foo {
    protected static $_things = array_merge($_things, ['other-thing']);
}

//and so on...
于 2012-11-16T03:01:35.253 回答