我收到错误:
致命错误:常量表达式包含无效操作 第214行的config.php
该行是:
protected static $dbname = 'mydb_'.$appdata['id'];
我是否在引号中出错了?或者在其他地方?
我对错误消息的搜索仅显示了不同的源原因(函数定义中的动态默认值)。
答案 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
);