PHP闭包作为静态类变量

时间:2014-02-08 11:07:41

标签: php class static closures

我想在我的类中有一个静态闭包变量,以便人们可以改变代码特定部分的行为。但是,我似乎无法在任何地方初始化它。

首先我尝试了这个:

public static $logger = function($sql) { print_r($sql); };

但显然PHP无法解决这个问题。好的,所以我做了一个静态init方法:

public static $logger;

static function init() {
    /* if (!Base::logger) */
    Base::logger = function($sql) { print_r($sql); };
}

在类定义之外的文件末尾调用它。但是这也给了我一个语法错误:解析错误:语法错误,[file]行[line]上的意外'='。任何提示?

1 个答案:

答案 0 :(得分:1)

语法错误正好在错误消息告诉你的地方(如果你给了我们行号,就更容易发现......):缺少$ - 符号。

Base::$logger = function (...)

除此之外,您还希望使用self::代替Base::,这可确保代码在没有任何其他更改的情况下工作,如果您重命名该类

self::$logger = function (...)

当将初始化程序更改为JIT创建闭包的getter时,您可以进一步改进此代码:

private static $logger = NULL;

public static function getLogger () {
    if (self::$logger === NULL) {
        self::$logger = function ($sql) {print_r($sql);};
    }
    return self::$logger;
}

[编辑]根据您对此的评论:能够更改$ logger的干净OOP方式是使用setter:

public static function setLogger ($closure) {
    self::$logger = $closure;
}

将此结果与上面的getter相结合可确保您始终获得setter设置的值,如果尚未设置,则确保默认值。使用setter将值设置回NULL会使getter再次创建默认值,这是另外的。