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. Однако это порождает ошибку; есть ли способ его достижения?

Неа. С 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()); 

Хотя вы не можете инициализировать его, чтобы иметь эти значения, вы можете вызвать статический метод, чтобы вставить их в свою собственную внутреннюю коллекцию, как я сделал ниже. Это может быть как можно ближе.

 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 Объект
     (
       [bar] => fizzbuzz
     )
   [1] => foo Объект
     (
       [bar] => fizzbuzz
     )
   [2] => foo Объект
     (
       [bar] => fizzbuzz
     )
 ) 

За комментарий wiseguys это то, что вам нужно сделать:

 class myclass { static $blah2; private function initBlah2() { $this->blah2 = array(&new myotherclass(), &new myotherclass(), &new myotherclass()); } } 

Проблема с вашим кодом заключается в том, что вы пытаетесь динамически создавать значения во время инициализации. Сделайте это в конструкторе.

Я думаю, что это то, что говорит wiseguy.