如何初始化静态变量

2022-08-30 06:20:28

我有这个代码:

private static $dates = array(
  'start' => mktime( 0,  0,  0,  7, 30, 2009),  // Start date
  'end'   => mktime( 0,  0,  0,  8,  2, 2009),  // End date
  'close' => mktime(23, 59, 59,  7, 20, 2009),  // Date when registration closes
  'early' => mktime( 0,  0,  0,  3, 19, 2009),  // Date when early bird discount ends
);

这给了我以下错误:

解析错误:语法错误,第 19 行的 /home/user/Sites/site/registration/inc/registration.class.inc 中出现意外的“(”,期望出现 “)”

所以,我想我做错了什么...但是,如果不是那样,我怎么能这样做呢?如果我用常规字符串更改mktime的东西,它就会起作用。所以我知道我可以像那样做。

有人有一些指点吗?


答案 1

PHP 无法解析初始值设定项中的非平凡表达式。

我更喜欢通过在类的定义之后立即添加代码来解决此问题:

class Foo {
  static $bar;
}
Foo::$bar = array(…);

class Foo {
  private static $bar;
  static function init()
  {
    self::$bar = array(…);
  }
}
Foo::init();

PHP 5.6 现在可以处理一些表达式。

/* For Abstract classes */
abstract class Foo{
    private static function bar(){
        static $bar = null;
        if ($bar == null)
            bar = array(...);
        return $bar;
    }
    /* use where necessary */
    self::bar();
}

答案 2

如果可以控制类装入,则可以从那里执行静态初始化。

例:

class MyClass { public static function static_init() { } }

在类装入器中,执行以下操作:

include($path . $klass . PHP_EXT);
if(method_exists($klass, 'static_init')) { $klass::staticInit() }

一个更重的解决方案是使用ReflemClass的接口:

interface StaticInit { public static function staticInit() { } }
class MyClass implements StaticInit { public static function staticInit() { } }

在类装入器中,执行以下操作:

$rc = new ReflectionClass($klass);
if(in_array('StaticInit', $rc->getInterfaceNames())) { $klass::staticInit() }

推荐