2016-10-21 3 views
13

Я получаю сообщение об ошибке:PHP Ошибка: Критическая ошибка: Постоянное выражение содержит недопустимые операции

Fatal error: Constant expression contains invalid operations in config.php on line 214

Эта линия была:

protected static $dbname = 'mydb_'.$appdata['id']; 

ли я какие-либо ошибки в кавычках? Или где-то еще?

Мой поиск сообщения об ошибке показал только другую причину источника (динамическое значение по умолчанию в определении функции).

+0

класса недвижимости Если вы не говорите, что неясно, какие объяснения вы нашли, люди, возможно, теряют время, составляя ту же самую информацию снова. –

+0

@ ÁlvaroGonzález Извините, парень, ответ от Al Fonce здесь очистил мою проблему. на самом деле другие похожие названия, которые я нашел здесь, в SO, имеют только аналогичный заголовок, но запрос отличается помощником. Вот почему я задал этот вопрос –

+1

Тогда еще один способ выразить это просто «Я не мог найти аналогичный вопрос здесь», и я бы сказал, что это явно предполагается, если вы ничего не говорите. Я взял на себя смелость изменить свой вопрос, чтобы это отразить. Неважно, сам вопрос может быть довольно интересным, если нет обманов (и если есть обманы, то, надеюсь, он будет связан с одним). –

ответ

12

Из official Php documentation:

Like any other PHP static variable, static properties may only be initialized using a literal or constant before PHP 5.6; expressions are not allowed. In PHP 5.6 and later, the same rules apply as const expressions: some limited expressions are possible, provided they can be evaluated at compile time.

Таким образом, вы не можете инициализировать статическую переменную с другой переменной. Замените $appdata['id'] на постоянную строку или удалите атрибут static.

Это потому, что статические заявления разрешаются в компиляции, когда содержание других переменных не известно (см this other page of official doc).

4

Raja это потому, что статическая переменная содержит в себе постоянное значение. Но в вашем случае:

protected static $dbname = 'mydb_'.$appdata['id']; 

$ AppData [ «ид»] динамична, что может изменить его значение во время выполнения. Вот почему появляется ошибка.

+0

Я понял, я просто изучаю любезное руководство для меня, так как в этом случае мне нужно связать динамическую переменную. Итак, как мне связать динамическое имя db –

2

Если вы запутались с отражением, единственным способом, которым я могу думать, чтобы иметь статический частный/защищенный класс с динамически генерируемым значением является вычислить его вне класса:

class Foo { 
    protected static $dbname = DBNAME; 

    public static function debug() { 
     return Foo::$dbname; 
    } 
} 

$appdata = array(
    'id' => 31416, 
); 
define('DBNAME', 'mydb_'.$appdata['id']); 
var_dump(Foo::debug()); 

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

class Foo { 
    protected $dbname; 

    public function __construct($appdata){ 
     $this->dbname = 'mydb_'.$appdata['id']; 
    } 

    public function debug() { 
     return $this->dbname; 
    } 
} 

$appdata = array(
    'id' => 31416, 
); 
$foo = new Foo($appdata); 
var_dump($foo->debug()); 
3

Я имел эту ошибку, и мое исправление было не объявлять дату в пределах массива

public static $config_array = array(
    'start_date' => date('Y-m-d H:i:s') // No can do 
); 
Смежные вопросы