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.
Однако это порождает ошибку; есть ли способ его достижения?
Ответы
Ответ 1
Неа. Из 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());
Ответ 2
Пока вы не можете инициализировать его, чтобы иметь эти значения, вы можете вызвать статический метод, чтобы вставить их в свою собственную внутреннюю коллекцию, как я сделал ниже. Это может быть как можно ближе.
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
(
[bar] => fizzbuzz
)
)
Ответ 3
В ответ на wiseguys это то, что вам нужно сделать:
class myclass
{
static $blah2;
private function initBlah2()
{
$this->blah2 = array(&new myotherclass(), &new myotherclass(), &new myotherclass());
}
}
Проблема с вашим кодом заключается в том, что вы пытаетесь динамически создавать значения во время инициализации. Сделайте это в конструкторе.
Я думаю, что это то, что говорит wiseguy.