Error de PHP: error fatal: la expresión constante contiene operaciones no válidas

Obtengo un error:

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

Esa línea era:

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

¿Si cometí errores entre comillas? ¿O en otro sitio?

Mi búsqueda del mensaje de error solo mostró una causa de origen diferente (un valor predeterminado dinámico en una definición de función).

Answer

De la documentación oficial de Php :

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.

Entonces no puede inicializar una variable estática con otra variable. Reemplace $appdata['id']con una cadena constante o elimine el staticatributo.

Esto se debe a que todas las declaraciones estáticas se resuelven en tiempo de compilación , cuando se desconoce el contenido de otras variables (ver esta otra página del documento oficial ).

A menos que te metas con la reflexión, la única forma en que puedo pensar para tener una propiedad de clase privada / protegida estática con un valor generado dinámicamente es calcularlo fuera de la clase:

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

Sin embargo, en su caso de uso preciso, es posible que simplemente no haya una buena razón para que la propiedad sea estática. En ese caso, es tan sencillo como usar el 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());

Esto se debe a que una variable estática contiene un valor constante. Pero en tu caso:

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

$appdata['id']es dinámico que puede cambiar su valor durante la ejecución. Por eso se muestra el error.

Tuve este error y mi solución fue no declarar una fecha dentro de una matriz de propiedades de clase

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

Para su información: - Obtuve el mismo error al usar algunos caracteres en expresiones constantes.

public static $dbPassword="[email protected]||sR";

Esto es lo que causó el error y lo eliminé || que son los caracteres lógicos del operador OR de la cadena y funcionó.