28

PHP のクラスでオブジェクトの静的配列を初期化できますか? あなたができるように

class myclass {
    public static $blah = array("test1", "test2", "test3");
}

しかし、私がするとき

class myclass {
    public static $blah2 = array(
        &new myotherclass(),
        &new myotherclass(),
        &new myotherclass()
    );
}

myotherclass は myclass のすぐ上で定義されます。ただし、エラーがスローされます。それを達成する方法はありますか?

4

2 に答える 2

29

いいえ。http://php.net/manual/en/language.oop5.static.phpから:

他の PHP 静的変数と同様に、静的プロパティはリテラルまたは定数を使用してのみ初期化できます。式は使用できません。したがって、静的プロパティを整数または配列 (たとえば) に初期化することはできますが、別の変数、関数の戻り値、またはオブジェクトに初期化することはできません。

プロパティを に初期化nullし、アクセサー メソッドでプライベートにし、アクセサーが最初に呼び出されたときに「実際の」初期化を行うようにします。次に例を示します。

    class myclass {

        private static $blah2 = null;

        public static function blah2() {
            if (self::$blah2 == null) {
               self::$blah2 = array( new myotherclass(),
                 new myotherclass(),
                 new myotherclass());
            }
            return self::$blah2;
        }
    }

    print_r(myclass::blah2());
于 2012-05-27T04:01:52.667 に答える
3

これらの値を持つように初期化することはできませんが、以下で行ったように、静的メソッドを呼び出して独自の内部コレクションにプッシュすることができます。これはあなたが得る限り近いかもしれません。

class foo {
  public $bar = "fizzbuzz";
}

class myClass {
  static public $array = array();
  static public function init() {
    while ( count( self::$array ) < 3 )
      array_push( self::$array, new foo() );
  }
}

myClass::init();
print_r( myClass::$array );

デモ: http://codepad.org/InTPdUCT

次の出力が得られます。

配列
(
  [0] => foo オブジェクト
    (
      [バー] => フィズバズ
    )
  [1] => foo オブジェクト
    (
      [バー] => フィズバズ
    )
  [2] => foo オブジェクト
    (
      [バー] => フィズバズ
    )
)
于 2012-05-27T04:09:48.543 に答える