我正在搞乱不同的PHP日志框架。我正在尝试PEAR :: Log。我想我会使用它的singleton
函数来确保只有一个类的实例。
我有一个类似守护进程的小脚本我想添加日志记录,因为它可能是系统中最简单的测试脚本。该脚本有几个功能。我可能想在函数内部记录内容。
我的问题是如何最好地管理这个单身人士?
我称之为:
&Log::singleton($handler, $name, $ident, $conf, $maxLevel);
每个函数中的似乎并不理想,特别是因为我已经在初始调用中指定了所有选项。 Pear :: Log序列化了这个信息,但从它看起来你仍然必须提供所有这些变量来获取实例。
另一种方法是将实例传递给每个函数。再次,似乎它不太理想。
我想你也可以把这个实例变成'全局'。
你在这种情况下做什么?有更好的解决方案吗?
答案 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)
另一种方法是将实例传递给每个函数。再次,似乎它不太理想。
基本上,您可以选择为每个函数,每个对象实例或其中一个全局范围传递依赖项。我发现使用对象实例范围通常会达到灵活性的良好平衡。通常,您应该尝试尽可能地限制变量的范围,因此如果它有意义,通过所有方法传递函数参数。