Ошибка PHP: Неустранимая ошибка: выражение константы содержит недопустимые операции
Я получаю сообщение об ошибке:
Неустранимая ошибка: выражение константы содержит недопустимые операции в config.php в строке 214
Эта строка была:
protected static $dbname = 'mydb_'.$appdata['id'];
Были ли ошибки в кавычках? Или где-то еще?
Мой поиск сообщения об ошибке показал только другую причину источника (динамическое значение по умолчанию в определении функции).
Ответы
Ответ 1
Из официальная документация Php:
Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы перед PHP 5.6; выражения не допускаются. В PHP 5.6 и более поздних версиях те же правила применяются как выражения const: возможны некоторые ограниченные выражения, если они могут быть оценены во время компиляции.
Таким образом, вы не можете инициализировать статическую переменную другой переменной. Замените $appdata['id']
на константную строку или удалите атрибут static
.
Это связано с тем, что статические объявления разрешаются во время компиляции, когда содержимое других переменных не известно (см. этот другой страница официального документа).
Ответ 2
Raja это потому, что статическая переменная содержит в себе постоянное значение. Но в вашем случае:
protected static $dbname = 'mydb_'.$appdata['id'];
$appdata ['id'] является динамическим, который может изменять его значение во время выполнения. Вот почему отображается ошибка.
Ответ 3
У меня была эта ошибка, и мое исправление заключалось в том, чтобы не объявлять дату в массиве свойств класса
public static $config_array = array(
'start_date' => date('Y-m-d H:i:s') // No can do
);
Ответ 4
Если вы не соблазнитесь отражением, единственный способ, которым я могу представить себе статическое свойство private/protected class с динамически генерируемым значением, - это рассчитать его вне класса:
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());