2015-01-03 2 views
1

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

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

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

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

Так в чем проблема?

+2

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

+0

Итак, как вы это делаете? –

+2

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

ответ

4

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

В качестве примера, что не работает!

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

class A { 

    private $basename = basename(__FILE__); 

} 

Что будет работать для этого следующих один, потому что мы присваиваем значение в конструкторе.

class A { 

    private $basename = ""; 

    public function __construct() { 

     $this->basename = basename(__FILE__); 

    } 

} 

Поскольку думать, что это был бы первый пример, возможно, каждый объект, созданный вами из этого класса, отличается! И определение класса похоже на план построения объекта, но если вы могли бы использовать функции в плане, вы могли бы каждый раз иметь другой план для создания объекта, так вот как работает ООП, и это не позволяет вам это делать!


Так что ваш пример не работает из-за того, что вы не можете использовать объект в определении класса. И решение для приведенного выше примера не работает для вас, потому что массив также статичен.

Таким образом, вы должны сделать массив «unstatic» и назначить объект массива в конструкторе, как это:

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

И цитата из:

Они (свойства) определяется с помощью одной из ключевых общественных, защищенных или частных, а затем обычных переменных де Декларации в. Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения для оценки.

+0

Помогло бы добавить некоторые «позитивные» способы, с помощью которых OP мог бы получить свой «код» для работы? Объясняя, почему это не работает, это явно «хорошо». Что они должны делать с того, где это сейчас? –

+0

@ RyanVincent Посмотрите на последний пример, я сделал пример, который работает. – Rizier123

+0

Я неправильно понял. –

0

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