1

我在搞乱不同的 PHP 日志框架。我目前正在尝试 PEAR::Log。我想我会使用它的singleton功能来确保只有一个类的实例。

我有一个类似守护进程的小脚本,我想添加日志记录,因为它可能是系统中要测试的最简单的脚本。这个脚本有几个功能。我可能想在函数中记录一些东西。

我的问题是如何最好地管理这个单例?

对我来说:

&Log::singleton($handler, $name, $ident, $conf, $maxLevel);

在每个函数中似乎并不理想,特别是因为我已经在初始调用中指定了所有选项。Pear::Log 序列化此信息,但从看起来您仍然必须提供所有这些变量来获取实例。

另一种选择是将实例传递给每个函数。再次,似乎它不太理想。

我想您也可以将实例设为“全局”。

在这种情况下你怎么办?有更好的解决方案吗?

4

4 回答 4

3

更好的是,如果您的最终目标是能够盲目跟注

Logger::Write("Something happened");

无论您需要它,您都可以将 Michal 的解决方案更进一步

class Logger {
    private static $log = null;

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function Write(String $str) {
        if($log == null)
            init(Log::singleton(...));

        $this->log->Write($str);
    }
}

这样,您的日志将在第一次使用时被初始化一次。

于 2008-12-12T16:21:58.603 回答
1

我对 PEAR::Log 了解不多,但为什么不创建另一个包装/简化日志记录的单例。

class Logger {

    private static $log;

    private function __construct() { }

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function get() {
        return self::$log;
    }

}

Logger使用实例初始化后,Log您可以通过Logger::get. 由于在 PHP 中可以取消引用,因此您可以这样做

Logger::get()->doSomething($foo, $bar);
于 2008-12-12T15:52:12.813 回答
1

只需使用全局实例。在某个地方,您必须有一个所有其他文件都必须包含的文件。只是在那里实例化它。如果你有一些反对全局变量的东西,你可能不应该在 PHP 中编程。

于 2008-12-12T15:58:16.060 回答
0

另一种选择是将实例传递给每个函数。再一次,似乎不太理想。

基本上,您可以选择为每个函数、每个对象实例或在一个全局范围内传递依赖项。我发现使用对象实例范围通常可以很好地平衡灵活性。一般来说,你应该尽量限制变量的范围,所以如果有意义的话,一定要通过函数参数。

于 2008-12-12T16:25:25.787 回答