Почему присвоение нового объекта значению массива PHP вызывает ParseError?

Я пытаюсь определить частный статический массив (так как я нахожусь на PHP 5.4 и не могу использовать постоянные массивы) следующим образом:

private static $regions = array(
'NA'  => new Region('NA', 'North America'),
'EUW' => new Region('EUW', 'Europe West'),
// etc...
);

К сожалению, это вызывает ParseError. Если я изменю new Region(...) код, который будет просто строкой для тестирования, больше не будет ошибки разбора. Кажется, это означает, что я не могу назначить объект как значение массива PHP, несмотря на документация заявляя, что это выполнимо:

Значение может быть любого типа.

Так в чем здесь проблема?

1

Решение

Вы не можете сделать это, потому что массив является статическим и в определении класса вы не можете использовать динамические значения, такие как объекты или функции.

Как пример, что не работает!

(Здесь я использовал функцию, но, как я сказал, вы не можете назначать «динамические» значения свойству в определении класса)

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, за которым следует обычное объявление переменной. Это объявление может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.

4

Другие решения

Один из способов получить ваши «статические переменные класса»
Инициализировано, чтобы запустить функцию ‘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)
0

По вопросам рекламы [email protected]