2017-01-19 7 views
0

は、私は静的メンバでいくつかの基本クラスを考えてみましょう - 配列:静的メンバー(配列)を部分的にオーバーライド - これは可能ですか?

class BaseClass { 
    public static $definition = array(
     'id' => array(type => 'int', 'required' => true), 
     'field1' => array(type => 'string', 'required' => true), 
     'field2' => array(type => 'bool', 'required' => true), 
     // and over8000 array items 
    ); 
} 

それから私は、子クラスを作成し、私はこの静的配列を上書きしたいが、私は唯一の配列項目をchengeする必要があります。変更されたアイテムが1つしかないために、「over8000」アイテム全体をコピー・ペーストしない方法はありますか?言い換えれば

、私はこのように、この

class ChildClass extends BaseClass { 
    public static $definition = array(
     'id' => array(type => 'int', 'required' => true), 
     'field1' => array(type => 'string', 'required' => false), // the only changed one 
     'field2' => array(type => 'bool', 'required' => true), 
     // and over8000 unchanged 
    ); 
} 

が、よりコンパクトなものではありませんしたい:

class ChildClass extends BaseClass { 
    // yes I know this is invalid, lets call this a "pseudocode" 
    public static $definition['field1']['required'] = true; 
} 

が方法はありますか?

ありがとうございます。

P.S.このメンバは静的コンテキスト(ChildClass::$definition['field1'];)でアクセスされるため、コンストラクタで変更を適用するには十分ではありません。

P.P.S.ただ明確にするために:私はすべての "機能"であるエンジンで作業しています。静的なコンテキストでもアクセスできる静的メンバーは、変更できないエンジンの部分です。

+0

8kアイテムの静的配列?ちょうどうわー。私はそのアイテムでクラスを作成します。変更が必要な場合は、動的なのでSTATICとして定義しないでください。論文に戻って、実際にそれが必要かどうかを確認してください。 – daremachine

+0

クラスから目的の値を返す静的メソッドを作成します。より柔軟になります。 – daremachine

+0

over8000 - いとこの表情ですが、時には約50の項目があります。 「紙に戻る」とはどういうことですか?残念ながら、私はエンジンのすべてを使って作業しています。 – AlexandrX

答えて

1

デフォルトのプロパティ値であり、プロパティを定義するときに式を使用することはできません。したがって、子クラスを定義するときに配列を変更する方法はありません。

それは静的プロパティであるので、あなたはクラスの後に次のコードを追加することができますし、クラスが定義された後、それが実行されます。

class ChildClass extends BaseClass { 
    public static $definition; 
} 

ChildClass::$definition = array_merge(BaseClass::$definition, array(
    'field1' => array(type => 'string', 'required' => false) 
)); 

ない良いアプローチが、それはあなたが必要なものだ場合、それは動作します。

関連する問題