60
votes

I am getting an error:

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

That line was:

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

Whether I did any mistakes in quotes? Or somewhere else?

My search for the error message only showed a different source cause (a dynamic default value in a function definition).

4
If you don't say what's unclear about the explanations you've found people will possibly waste time composing the same information again.Álvaro González
@ÁlvaroGonzález Sorry mate , The answer by Al Fonce here cleared my issue . actually other similar titles i found here in SO has only similar title but the query differs mate . That is why i asked this questionRaja Gopal
Then another way to express that is just "I couldn't find a similar question here" and I'd say that's explicitly assumed if you don't say anything. I've taken the liberty of editing your question to reflect that. Never mind, the question itself can be pretty interesting if there aren't dupes (and if there're dupes it'll hopefully be linked to one).Álvaro González

4 Answers

59
votes

From the 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.

So you cannot initialize a static variable with another variable. Replace $appdata['id'] with a constant string or remove the static attribute.

This is because all static declarations are resolved in compile-time, when the content of other variables is not known (see this other page of official doc).

20
votes

Unless you mess with reflection, the only way I can think of to have a static private/protected class property with a dynamically generated value is to calculate it outside the 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());

In your precise use case, however, it's possible that there's simply no good reason for the property to be static. In that case, it's as straightforward as using the constructor:

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());
14
votes

This is because a static variable contains a constant value in it. But in your case:

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

$appdata['id'] is dynamic that can change its value during the execution. That's why the error is showing.

6
votes

I had this error and my fix was to not declare a date within a class property array

public static $config_array = array(
    'start_date' => date('Y-m-d H:i:s') // No can do
);