在我的许多网站上,我使用了一个名为“Logger”的自制 PHP 类(基本上,它用于将信息记录到日志文件中,并按日期:年/月......自动组织这些文件)。
我通过在我的引导文件中创建一个 Logger 实例来使用它(包含在任何地方):
require 'lib/Logger.class.php';
$mainLogger = new Logger('./my_log_folder');
这迫使我$mainLogger
在需要记录某些内容的每个函数中设置全局,并在调用任何方法之前检查记录器是否已实例化:
function foo($bar){
global $mainLogger;
if( !is_null($mainLogger) ){
// If the logger is instanciated, I can log my message
$mainLogger->log('error', 'mysql-errors', "My error message lorem ipsum dolor sit amet", Logger::GRAN_MONTH);
}
}
为了使这个工具更容易使用和编写更少的代码,我正在考虑创建一个函数(在 Logger 类之外)来处理$mainLogger
(接近单例设计模式的东西)的实例化和检索:
function getLogger(){
global $mainLogger;
if( !isset($mainLogger) ){
if( class_exists('Logger') ){
// Instanciation of the main logger
$mainLogger = new Logger('./my_log_folder');
} else {
// The Logger class doesn't exists, so we'll return a magical object to "mimic" the logger attributes & methods, thus avoiding fatal errors
return new MagicalClass();
}
}
return $mainLogger;
}
class MagicalClass {
public function __get($name){
return;
}
public function __call($name, $args){
return $this; // Allow to chain calls to this class, like jQuery : getLogger->foo()->bar()...
}
}
MagicalClass 旨在避免致命错误(致命错误:调用未定义的方法...),例如调用此方法可能引发的错误(不包括 Logger.class.php):
getLogger->log('error', 'mysql-errors', "My error message lorem ipsum dolor sit amet", Logger::GRAN_MONTH);
感谢_电话和_get,任何尝试使用 Logger 类的属性或方法都不会导致任何错误(错误日志记录是一个可选功能,如果 Logger 不存在,它不应该让应用程序崩溃)。
您如何看待这种方法,这是一个坏主意吗?这会给我带来一些麻烦吗?什么样的?
谢谢
PS:如果你想看 Logger 类,你可以在我的网站上下载。