管理单身人士最好的方法是什么?

时间:2008-12-12 15:11:36

标签: php design-patterns singleton

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

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

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

我称之为:

&Log::singleton($handler, $name, $ident, $conf, $maxLevel);
每个函数中的

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

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

我想你也可以把这个实例变成'全局'。

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

4 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分: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);

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

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

基本上,您可以选择为每个函数,每个对象实例或其中一个全局范围传递依赖项。我发现使用对象实例范围通常会达到灵活性的良好平衡。通常,您应该尝试尽可能地限制变量的范围,因此如果它有意义,通过所有方法传递函数参数。