【问题标题】:Syntax error while defining an array as a property of a class将数组定义为类的属性时出现语法错误
【发布时间】:2019-07-23 14:04:10
【问题描述】:
...

public $aSettings = array(
  'BindHost' => "127.0.0.1",
  'Port' => 9123,
  'MaxFileSize' => (5 * (1024 * 1024)), // unexpected "(" here
  'UploadedURL' => "http://localhost",
  'UploadPath' => dirname(__FILE__) . "/upload",
  'UploadMap' => dirname(__FILE__) . "/uploads.object",
  'RegisterMode' => false
);

...

这是我的代码,直接来自课堂。我遇到的问题是"unexpected ( on line 22",第22行是MaxFileSize

我看不出有什么问题,这是 Zend 引擎的限制吗?还是我瞎了。

【问题讨论】:

  • 对我来说很好 -> codepad.org/EIorteTQ .... 我猜这是在类中定义非常量变量的问题
  • 您是否尝试仅删除外部( )?或者只是该行上的所有( ),因为在进行乘法运算时不需要它们......
  • 我删除了访问说明符 public 并且它可以工作
  • silly's answer 类似的问题在这方面很有用。虽然它使用与Michael Krelin's 相同的方法,但它展示了一种在类定义中包含初始化逻辑的方法。

标签: php object


【解决方案1】:

在 5.6 之前的 PHP 版本中初始化类属性时,您不能使用非常量值
这些在编译时初始化,此时 PHP 不会进行任何计算或执行任何代码。 (5 * (1024 * 1024)) 是一个需要求值的表达式,你不能在那里进行。要么用常量值5242880 替换它,要么在__construct 中进行计算。

PHP 5.6,于 2014 年推出,allows "constant scalar expressions",其中标量常量或类属性可以通过类定义中的计算表达式而不是构造函数来初始化。

【讨论】:

  • 谢谢,我不知道。我将把操作转移到我的构造中。
【解决方案2】:

我怀疑这不是完整的代码,这是一个类中静态变量的定义,你的表达式非常有限,不能进行很多计算。

如果我是对的,你可能想做类似的事情:

class thingamajig {
    public static $aSettings;
};
thingamajig::$aSettings = array ( ... );

附:抱歉,我刚刚阅读了您的散文,您确认它是类静态变量的一部分。所以你不能只忽略不合适的关键字。

【讨论】:

  • 确实不是全部的代码,是从一个类文件中取出来的,我把周围的代码去掉了。
  • 是的,现在阅读。一开始读完太明显了:)
【解决方案3】:

我假设您显示的实际上是一个类属性(因为 public 关键字)。 PHP中类属性的初始化必须是常量。

这个声明可能包含一个初始化,但是这个 初始化必须是一个常量值——也就是说,它必须能够 在编译时进行评估,并且不能依赖于运行时 信息以便进行评估。

http://www.php.net/manual/en/language.oop5.properties.php

【讨论】:

    【解决方案4】:

    当你在类中定义变量时,你不能给它赋值表达式。 (5 * (1024 * 1024)) 是一个表达式。 6164480 不是。

    【讨论】:

    • 技术上6164480 也是一个表达式,只是一个非常简单的表达式。 :o)
    • 嗯...是的,@deceze 描述得更准确:)
    【解决方案5】:

    自 PHP 5.6 起不再存在此限制

    启用以前不允许的语法的新功能称为constant scalar expressions

    现在可以提供涉及数字的标量表达式 和字符串文字和/或常量在 PHP 以前的上下文中 期望一个静态值,例如常量和属性声明 和默认函数参数。

    class C {
        const THREE = TWO + 1;
        const ONE_THIRD = ONE / self::THREE;
        const SENTENCE = 'The value of THREE is '.self::THREE;
    
        public function f($a = ONE + self::THREE) {
            return $a;
        }
    }
    
    echo (new C)->f()."\n"; echo C::SENTENCE; ?>
    

    上面的例子会输出:

    4 The value of THREE is 3
    

    【讨论】:

      【解决方案6】:

      Public 是仅在对象中使用的声明。这不是对象,去掉 public 就可以了。

      【讨论】:

      • 代码取自对象,因此忽略 public 关键字。
      • 好的,我确实把它拿出来了,php -l 没有出现任何错误,所以即使它在那里报告错误也在其他地方。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2022-08-03
      • 2022-11-28
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多