2014-01-06 2 views
0

Это прекрасно работает:PHP новичок: не может использовать константу для определения массива

$entity->field_time[LANGUAGE_NONE][0] = array(
    'value' => date_format($date), 
    'timezone' => 'UTC', 
); 

Но мне нужно, чтобы сделать его более универсальным, чтобы учесть различные имена полей. Поэтому я стараюсь использовать константу:

define('FIELD_TIME', 'field_time'); 
$entity->FIELD_TIME[LANGUAGE_NONE][0] = array(
    'value' => date_format($date), 
    'timezone' => 'UTC', 
); 

Но это не цель правильное имя массива, который должен быть [field_time] [LANGUAGE_NONE] [0]

Я также попытался:

define('FIELD_TIME', 'field_time'); 
$entity->constant('FIELD_TIME')[LANGUAGE_NONE][0] = array(
    'value' => date_format($date), 
    'timezone' => 'UTC', 
    ); 

Но это бросает: Ошибка анализа: синтаксическая ошибка, неожиданная '['

Что я делаю неправильно?

+1

«Значение постоянных;. Только скалярных и нулевые значения разрешены скалярные значения являются целыми числами, с плавающей точкой, строка или логические значения. Можно определить константы ресурсов, однако это не рекомендуется и может вызвать непредсказуемое поведение ». – Flosculus

+0

@Flosculus. Он не хотел использовать константу как массив, но это значение. Допустим, у вас есть класс с свойством (array) = 'public $ _arr = array (...);' и в другом файле 'define ('BLA', '_arr');'. OP хочет делать '$ obj -> _ arr = ...', но используя константу value => '$ obj-> BLA =' –

+0

Если 'FIELD_TIME' является константой класса, не следует ли ее обращаться статически, как' EntityClass :: FIELD_TIME'? – Flosculus

ответ

1

Попробуйте

$entity->{FIELD_TIME}[LANGUAGE_NONE][0] = 'something'; 

Да, только кронштейн постоянная! Это также работает для вызовов функций

$entity->{FUNC_NAME_CONST}(); 
+0

Отлично работает - спасибо! – Jason

0
define('FIELD_TIME', 'field_time'); 
$entity->constant('FIELD_TIME')[LANGUAGE_NONE][0] = array(
    'value' => date_format($date), 
    'timezone' => 'UTC', 
    ); 

Этот способ должен работать, но на PHP 5.4

В противном случае вам потребуется больше одна строка:

define('FIELD_TIME', 'field_time'); 
$field_time = constant('FIELD_TIME'); 
$entity->$field_time[LANGUAGE_NONE][0] = array(
'value' => date_format($date), 
     'timezone' => 'UTC', 
     ); 

http://php.net/manual/en/migration54.new-features.php

Function array dereferencing has been added, e.g. foo()[0].


Если я понял правильно, это следует использовать как:

class Entity { 
    public $field_time = null; 
} 
$entity = new Entity(); 
/** 
* Instead of: 
* $entity->field_time[LANGUAGE_NONE][0] = array('key' => 'val'); 
*/ 
define('FIELD_TIME', 'field_time'); 
$field_time = constant('FIELD_TIME'); 
// or $field_time = FIELD_TIME; 
$entity->$field_time[LANGUAGE_NONE][0] = array('key' => 'val'); 
0

Вы не можете получить доступ к массиву непосредственно из возвращаемого значения метода.

$entity->constant('FIELD_TIME')[LANGUAGE_NONE][0] 

неправильно, хранить возвращаемое значение постоянной() сначала в другой переменной и доступа LANGUAGE_NONE с помощью этого массива.

0

, если я понимаю, что вы хорошо, вы просто хотите использовать константу для вызова правильного массива по его имени?

define('FIELD_TIME', 'field_time'); 
$entity->{FIELD_TIME}[LANGUAGE_NONE][0] = array(
    'value' => date_format($date), 
    'timezone' => 'UTC', 
); 

это прекрасно работает для меня, если у вас есть объявленный массив с именем «field_time»

Смежные вопросы