Ошибка 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());