Я пытаюсь определить частный статический массив (так как я нахожусь на PHP 5.4 и не могу использовать постоянные массивы) следующим образом:
private static $regions = array(
'NA' => new Region('NA', 'North America'),
'EUW' => new Region('EUW', 'Europe West'),
// etc...
);
К сожалению, это вызывает ParseError. Если я изменю new Region(...)
код, который будет просто строкой для тестирования, больше не будет ошибки разбора. Кажется, это означает, что я не могу назначить объект как значение массива PHP, несмотря на документация заявляя, что это выполнимо:
Значение может быть любого типа.
Так в чем здесь проблема?
Вы не можете сделать это, потому что массив является статическим и в определении класса вы не можете использовать динамические значения, такие как объекты или функции.
Как пример, что не работает!
(Здесь я использовал функцию, но, как я сказал, вы не можете назначать «динамические» значения свойству в определении класса)
class A {
private $basename = basename(__FILE__);
}
Что будет работать для этого, является следующим, потому что мы присваиваем значение в конструкторе.
class A {
private $basename = "";
public function __construct() {
$this->basename = basename(__FILE__);
}
}
Потому что думать об этом было бы первым возможным примером, может быть каждый объект, который вы создаете из этого класса, отличается! И определение класса похоже на план для создания объекта, но если бы вы могли использовать функции в плане, у вас мог бы быть каждый раз другой план для создания объекта, так что ООП работает, и это не позволяет вам сделать это!
Так что ваш пример не работает из-за этого, потому что вы не можете использовать объект в определении класса. И решение для примера выше не работает ни для вас, потому что массив также является статическим.
Таким образом, вы должны сделать массив «нестатическим» и присвоить объект массиву в конструкторе следующим образом:
class A {
private $regions = array(
'NA' => "",
'EUW' => ""// etc...
);
public function __construct() {
$this->regions["NA"] = new B();
$this->regions["EUW"] = new B();
}
}
Итак, в конце, чтобы дать вам что-нибудь приятное для чтения и из официального источника смотрите: http://php.net/manual/en/language.oop5.properties.php
И цитата из:
Они (свойства) определяются с использованием одного из ключевых слов public, protected или private, за которым следует обычное объявление переменной. Это объявление может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.
Один из способов получить ваши «статические переменные класса»
Инициализировано, чтобы запустить функцию ‘init ()’, в которой вы можете делать все что угодно, чтобы установить внутренние «статические переменные» в классе.
Поскольку вы имеете дело с «ограничением» «системы». Некоторое отклонение от «правил», я думаю, разрешено. Самый простой способ — запустить функцию ‘init () после объявления класса.
Примечание: «правила» заключаются в том, что «файл» объявляет «класс», а «отдельный» файл выполняет «действия» над классом. Я думаю, что это использование, используемое здесь, «вроде» хорошо «. Хм … нет «единственно верного пути»?
Думайте об этом как о «ограничении» «инициализации класса».
Представьте, что я хочу инициализированный класс статических дат. Это просто для того, чтобы показать, что вы можете сделать что-нибудь в функции ‘init ()’.
Класс:
class A {
/*
* What i want is a date and time object in this static variable
*/
// private static $when = \DateTime::createFromFormat('Y-m-d H:m:s', '2014-04-01 11:59:00');
// so i need to initialize it later...
private static $when = null;
// show the stored DateTime
public static function showDateTime($format = \DATE_RFC850)
{
if (is_null(self::$when)) {
return 'Is not set yet...';
}
else {
return self::$when->format($format);
}
}
public static function getWhen()
{
return self::$when;
}
public static function init($when = '2014-04-01 11:59:00')
{
self::$when = \DateTime::createFromFormat('Y-m-d H:i:s', $when);
}
}
var_dump('Before Init: '. \A::showDateTime());
/*
* now run the init()
*/
\A::init();
var_dump('After Init: '. \A::showDateTime());
Результат:
string 'Before Init: Is not set yet...' (length=30)
string 'After Init: Tuesday, 01-Apr-14 11:59:00 BST' (length=43)