【问题标题】:PHP closure as static class variablePHP闭包作为静态类变量
【发布时间】:2014-03-05 21:30:45
【问题描述】:

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

首先我尝试了这个:

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); };
}

并在文件末尾,在类定义之外调用它。但这也给了我一个语法错误:解析错误:语法错误,[文件]中的意外'='在第[行]行。有什么提示吗?

【问题讨论】:

  • 你只是忘记了 $ :Base::$logger =
  • 是的,就是这样!谢谢!

标签: php class static closures


【解决方案1】:

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

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 再次创建默认值,这是另一个优点。

【讨论】:

  • 哦,非常感谢哈哈这很令人困惑,因为在访问非静态字段时我不需要那里的 $...我想知道如果我想从变量中读取名称该怎么办,就像我可以使用非静态字段一样: $foo = 'logger';自我::$foo ...
  • 并且:使用 double-$ 拥有变量变量 [原文如此!] 名称:$foo = 'logger'; self::$$foo 是要走的路。
  • 我不能这样做,因为关闭的目的是允许该类的用户更改 $logger 以做他想做的任何事情......所以它必须只设置一次默认值, 在开始时,如果它为 null,则表示他将其设置为 null 并且不想记录任何内容。但这是为其他事情做这件事的好方法:)
  • 看你的意思。是的,在你的情况下不可能,我同意(除非你使用的是 setter 方法,这将是干净的 OOP 方式;))
  • 再次编辑以反映这一点。
猜你喜欢
  • 2020-03-10
  • 2014-03-15
  • 1970-01-01
  • 2016-08-14
  • 2014-11-09
  • 2015-05-26
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多