关于php:将数组定义为类的属性时出现语法错误

Syntax error while defining an array as a property of a class

1
2
3
4
5
6
7
8
9
10
11
12
13
...

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引擎的限制吗?还是我瞎了眼?


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

2014年引入的php 5.6允许"常量标量表达式",其中标量常量或类属性可以由类定义中的计算表达式而不是构造函数初始化。


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

This declaration may include an initialization, but this
initialization must be a constant value--that is, it must be able to
be evaluated at compile time and must not depend on run-time
information in order to be evaluated.

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


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

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

1
2
3
4
class thingamajig {
    public static $aSettings;
};
thingamajig::$aSettings = array ( ... );

抱歉,我刚刚读了你的散文,你确认它是类静态变量的一部分。所以你不能忽略不恰当的关键词。


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


从php 5.6开始,这个限制就不再存在了。

启用以前不允许的语法的新功能称为常量标量表达式:

It is now possible to provide a scalar expression involving numeric
and string literals and/or constants in contexts where PHP previously
expected a static value, such as constant and property declarations
and default function arguments.

1
2
3
4
5
6
7
8
9
10
11
12
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()."
"
; echo C::SENTENCE; ?>

The above example will output:

1
4 The value of THREE is 3

public是一个只在对象中使用的声明。这不是一个对象,移除公共对象,这很好。