私の Web サイトの多くで、"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);
}
}
$mainLogger
このツールを使いやすくし、コードを少なくするために、 (シングルトン デザイン パターンに近いもの)のインスタンス化と取得を処理する関数 (Logger クラスの外部) を作成することを考えていました。
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 クラスを見たい場合は、私の Web サイトのこちらからダウンロードできます。