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」要素は1回だけ(in Foo)定義する必要があり、「other-thing」要素は1回だけ(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 に答える