我想在我的类中有一个静态闭包变量,以便人们可以改变代码特定部分的行为。但是,我似乎无法在任何地方初始化它。
首先我尝试了这个:
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]上的意外'='。任何提示?
答案 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再次创建默认值,这是另外的。