我收到一个错误:
致命错误:常量表达式在第214行的config.php中包含无效操作
那条线是:
protected static $dbname = 'mydb_'.$appdata['id'];
Run Code Online (Sandbox Code Playgroud)
我是否在引号中出错了?或者别的地方?
我对错误消息的搜索仅显示不同的源原因(函数定义中的动态默认值).
Al *_* ѫ 39
从官方Php文档:
与任何其他PHP静态变量一样,静态属性只能在PHP 5.6之前使用文字或常量进行初始化; 表达式是不允许的.在PHP 5.6及更高版本中,相同的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时进行评估.
因此,您无法使用另一个变量初始化静态变量.替换$appdata['id']为常量字符串或删除static属性.
这是因为当其他变量的内容未知时,所有静态声明都在编译时解析(参见官方文档的这个其他页面).
Álv*_*lez 11
除非你弄乱了反射,否则我能想到的唯一一种具有动态生成值的静态私有/受保护类属性的方法是在类外部计算它:
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());
Run Code Online (Sandbox Code Playgroud)
然而,在您的精确用例中,可能没有充分理由使该属性成为静态.在这种情况下,它与使用构造函数一样简单:
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());
Run Code Online (Sandbox Code Playgroud)
Raja这是因为静态变量中包含一个常量值.但在你的情况下:
protected static $dbname = 'mydb_'.$appdata['id'];
Run Code Online (Sandbox Code Playgroud)
$ appdata ['id']是动态的,可以在执行期间更改其值.这就是错误显示的原因.
我遇到了这个错误,我的解决方法是不在类属性数组中声明日期
public static $config_array = array(
'start_date' => date('Y-m-d H:i:s') // No can do
);
Run Code Online (Sandbox Code Playgroud)