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

Raj*_*pal 37 php

我收到一个错误:

致命错误:常量表达式在第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属性.

这是因为当其他变量的内容未知,所有静态声明都在编译时解析(参见官方文档的这个其他页面).

  • 您能详细说明一下**编译时**吗?对于像 PHP 这样的解释性语言来说,这意味着什么?即使在 C# 这样的编译语言中,使用静态构造函数也不会有这样的限制。 (2认同)

Á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)

  • @Pierre-LucBertrand 我[不确定](https://3v4l.org/6NLqC)你想说的话。 (2认同)

May*_*eyz 8

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

protected static $dbname = 'mydb_'.$appdata['id'];
Run Code Online (Sandbox Code Playgroud)

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


Jac*_*son 6

我遇到了这个错误,我的解决方法是不在类属性数组中声明日期

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