【问题标题】:PHP Error : Fatal error: Constant expression contains invalid operationsPHP错误:致命错误:常量表达式包含无效操作
【发布时间】:2017-03-03 11:08:12
【问题描述】:

我收到一个错误:

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

那行是:

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

我在引号中是否有任何错误?还是别的地方?

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

【问题讨论】:

  • 如果你不说出你发现的解释不清楚的地方,人们可能会浪费时间再次编写相同的信息。
  • @ÁlvaroGonzález 对不起,伙计,Al Fonce 的回答解决了我的问题。实际上,我在 SO 中找到的其他类似标题只有类似的标题,但查询不同 mate 。这就是我问这个问题的原因
  • 那么另一种表达方式就是“我在这里找不到类似的问题”,如果你什么都不说,我会说这是明确假设的。我冒昧地编辑了您的问题以反映这一点。没关系,如果没有骗子,这个问题本身可能会很有趣(如果有骗子,它有望与一个相关联)。

标签: php


【解决方案1】:

供您参考:- 在常量表达式中使用某些字符时,我得到了同样的错误。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我明白了,我只是在学习,请指导我,因为在这种情况下我需要关联一个动态变量。那么,我应该如何关联动态数据库名称
    • 在这种情况下不要使用静态
    【解决方案3】:

    来自official Php documentation

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

    所以你不能用另一个变量初始化一个静态变量。将$appdata['id'] 替换为常量字符串或删除static 属性。

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

    【讨论】:

    • 您能详细说明一下编译时间吗?这对于像 PHP 这样的解释型语言意味着什么?即使在像 C# 这样的编译语言中,使用静态构造函数也不会有这样的限制。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      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());
      

      【讨论】:

      • 我相信这只是因为你有效地使用了常量。尝试使用在“编译”时无法解析的环境变量。
      • @Pierre-LucBertrand 我是 unsure 你想说的。
      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2020-06-27
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多