Php 什么';管理单身汉的最佳方法是什么?
我正在摆弄不同的PHP日志框架。我目前正在尝试PEAR::Log。我想我应该使用它的Php 什么';管理单身汉的最佳方法是什么?,php,design-patterns,singleton,Php,Design Patterns,Singleton,我正在摆弄不同的PHP日志框架。我目前正在尝试PEAR::Log。我想我应该使用它的singleton函数来确保这个类只有一个实例 我有一个类似守护进程的小脚本,我想添加日志记录,因为它可能是系统中最简单的测试脚本。这个脚本有几个功能。我可能想在函数中记录一些东西 我的问题是如何最好地管理这个单身汉 给我打电话: &Log::singleton($handler, $name, $ident, $conf, $maxLevel); 在每个函数中似乎都不理想,特别是因为我已经在初始调用中
singleton
函数来确保这个类只有一个实例
我有一个类似守护进程的小脚本,我想添加日志记录,因为它可能是系统中最简单的测试脚本。这个脚本有几个功能。我可能想在函数中记录一些东西
我的问题是如何最好地管理这个单身汉
给我打电话:
&Log::singleton($handler, $name, $ident, $conf, $maxLevel);
在每个函数中似乎都不理想,特别是因为我已经在初始调用中指定了所有选项。日志序列化了这些信息,但从外观上看,您仍然必须提供所有这些变量才能获得实例
另一种选择是将实例传递到每个函数中。再一次,这似乎不太理想
我想您也可以将该实例设置为“全局”
在这种情况下你会怎么做?有更好的解决方案吗 我对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;
}
}
使用Log
实例初始化Logger
后,您可以通过Logger::get
访问它。因为在PHP中取消引用是可能的,所以您可以这样做
Logger::get()->doSomething($foo, $bar);
我对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;
}
}
使用Log
实例初始化Logger
后,您可以通过Logger::get
访问它。因为在PHP中取消引用是可能的,所以您可以这样做
Logger::get()->doSomething($foo, $bar);
只需使用一个全局实例。你必须在某个地方有一个所有其他文件都必须包含的文件。只是在那里实例化它。如果您对全局变量有异议,您可能不应该使用PHP编程。只需使用全局实例即可。你必须在某个地方有一个所有其他文件都必须包含的文件。只是在那里实例化它。如果您对全局变量有异议,您可能不应该使用PHP编程。如果您的最终目标是能够盲目调用
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);
}
}
这样,您的日志将在第一次使用时初始化一次。如果您的最终目标是能够盲目调用
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);
}
}
这样,您的日志将在第一次使用时初始化一次
另一种选择是将实例传递到每个函数中。再一次,它似乎不太理想
基本上,您可以选择为每个函数、每个对象实例或一个全局范围传递依赖项。我发现使用对象实例范围通常能很好地平衡灵活性。通常,您应该尽可能地限制变量的范围,因此,如果有意义的话,可以通过各种方式传递函数参数
另一种选择是将实例传递到每个函数中。再一次,它似乎不太理想
基本上,您可以选择为每个函数、每个对象实例或一个全局范围传递依赖项。我发现使用对象实例范围通常能很好地平衡灵活性。通常,您应该尽可能地限制变量的范围,因此,如果有意义的话,可以通过各种方式传递函数参数。单例可以是特定于名称空间的(即5.3之前的“前缀类”),而全局变量不能这样做。当你包含一个使用全局变量的库时,它总是很好的…如果他在写一个库,谨慎是好的。但对于我自己的非库代码,我更喜欢可读性$LOGGER->foo()比LOGGER::get()->foo()好得多。在我的版本中,可以使用一个小类禁用记录器:类NoLogger{public function}uuuu get(){}public function}uuuu call(){};一个单例可以是特定于名称空间的(即5.3之前的“前缀类”),这是全局变量不能接受的。当你包含一个使用全局变量的库时,它总是很好的…如果他在写一个库,谨慎是好的。但对于我自己的非库代码,我更喜欢可读性$LOGGER->foo()比LOGGER::get()->foo()好得多。在我的版本中,可以使用一个小类禁用记录器:类NoLogger{public function}uuuu get(){}public function}uuuu call(){};