PHP错误:致命错误:常量表达式包含无效操作

时间:2016-10-21 08:13:52

标签: php

我收到错误:

  

致命错误:常量表达式包含无效操作   第214行的config.php

该行是:

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

我是否在引号中出错了?或者在其他地方?

我对错误消息的搜索仅显示了不同的源原因(函数定义中的动态默认值)。

4 个答案:

答案 0 :(得分:32)

来自official Php documentation

  

与任何其他PHP静态变量一样,静态属性只能在PHP 5.6之前使用文字或常量进行初始化;表达式是不允许的。在PHP 5.6及更高版本中,相同的规则适用于const表达式:只要可以在编译时对它们进行求值,就可以使用一些有限的表达式。

因此,您无法使用另一个变量初始化静态变量。将$appdata['id']替换为常量字符串或删除static属性。

这是因为 所有静态声明都在编译时解析 ,当其他变量的内容未知时(参见this other page of official doc)。

答案 1 :(得分:7)

Raja这是因为静态变量中包含一个常量值。但在你的情况下:

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

$ appdata [' id'] 是动态的,可以在执行期间更改其值。这就是错误显示的原因。

答案 2 :(得分:6)

除非你搞砸了反射,否则我能想到的唯一一种具有动态生成值的静态私有/受保护类属性的方法是在类外部计算它:

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 :(得分:3)

我遇到了这个错误,我的修复是不在类属性数组中声明日期

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