web-dev-qa-db-ja.com

PHP-オブジェクトの静的配列を定義

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

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

しかし、私がするとき

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

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

22
user1181950

いや。 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());
26
Mark Reed

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

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

その結果、次の出力が得られます。

Array 
(
 [0] => foo Object 
(
 [bar] => fizzbuzz 
)
 [1] => foo Object 
(
 [bar] => fizzbuzz 
)
 [2] => foo Object 
(
 [バー] => fizzbuzz 
)
)
3
Sampson