вы можете инициализировать статический массив объектов в классе 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.