PHP错误:无法加载模块常量表达式包含无效操作

2jcobegt  于 2023-05-21  发布在  PHP
关注(0)|答案(6)|浏览(143)

我收到一个错误:
致命错误:Constant expression contains invalid operations in config.php on line 214
那句台词是:

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

我是否在引号中犯了错误?还是别的地方?
我对错误消息的搜索只显示了不同的源原因(函数定义中的动态默认值)。

vuktfyat

vuktfyat1#

来自official Php documentation

与其他PHP静态变量一样,在PHP5.6之前,静态属性只能使用文字或常量初始化;不允许使用表达式。在PHP 5.6及更高版本中,同样的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时被求值。
所以你不能用另一个变量初始化一个静态变量。将$appdata['id']替换为常量字符串或删除static属性。
这是因为***所有的静态声明都是在编译时解析的***,此时其他变量的内容是未知的(参见this other page of official doc)。

dauxcl2d

dauxcl2d2#

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

class Foo
{
    protected static string $dbname = DBNAME;

    public static function debug(): string
    {
        return Foo::$dbname;
    }
}

$appdata = [
    'id' => 31416,
];
define('DBNAME', 'mydb_' . $appdata['id']);
var_dump(Foo::debug());

然而,在您的具体用例中,* 可能 * 根本没有理由将属性设置为静态属性。在这种情况下,它就像使用构造函数一样简单:

class Foo
{
    protected string $dbname;

    public function __construct(array $appdata)
    {
        $this->dbname = 'mydb_' . $appdata['id'];
    }

    public function debug(): string
    {
        return $this->dbname;
    }
}

$appdata = [
    'id' => 31416,
];
$foo = new Foo($appdata);
var_dump($foo->debug());
kd3sttzy

kd3sttzy3#

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

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

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

yeotifhr

yeotifhr4#

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

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

g6ll5ycj5#

在我的例子中,这个问题的解决方案是创建一个单例类,这样变量的值只被初始化(计算)一次,并且在需要的时候仍然可以访问它。

  • (额外信息:单例是一种设计模式,它限制你在整个程序中只有0或1个类的示例。有几种设计模式,我收集了115个,到目前为止in a single image)*

在你的例子中,代码看起来像这样:

class DataBaseConfig {
                 
    private static $instance;
    private $dbname ;
                
    private final function __construct() {
        $this->$dbname = 'mydb_'.$appdata['id'];
    }
    
    public static function getName() {
        if (!isset(self::$instance)) {
            self::$instance = new DataBaseConfig();
        }
        return self::$instance->$dbname;
    }
}

您可以像DataBaseConfig::getName()一样使用它来获得最短/最简单的版本。
实际上,你有更复杂的类和函数,所以通过定义一个getInstance()函数,你将避免为你添加的每个函数重复-行。

  • (额外信息:2同义词范例DRY -不要重复自己和DIE -复制是邪恶的)*

这是你需要的重构:

public static function getInstance() {
    if (!isset(self::$instance)) {
        self::$instance = new PhpStarter();
    }
    return self::$instance;
}

public function getName() {
    return $this->$dbname;
}

使用它就像$db = DataBaseConfig::getInstance();,然后$db->getName()$db->getSomethingElse()用于其他函数。

ppcbkaq5

ppcbkaq56#

供您参考:-我得到了同样的错误,通过使用一些字符在一个常数表达式。

public static $dbPassword="mAkE-34@-||sR";

这就是导致错误的原因,我删除了此**||**这是字符串中的逻辑OR运算符字符,它起作用了。

相关问题