PHP 用のログ システムを実装していますが、少し行き詰まっています。
すべての構成は、ログに記録するすべてのメソッドを宣言する XML ファイルで定義されます。XML は適切に解析され、多次元配列 ( ) に変換されclassname => array of methods
ます。ここまでは順調ですね。
簡単な例を見てみましょう:
#A.php
class A {
public function foo($bar) {
echo ' // Hello there !';
}
public function bar($foo) {
echo " $ù$ùmezf$z !";
}
}
#B.php
class B {
public function far($boo) {
echo $boo;
}
}
さて、私がこの設定ファイルを持っているとしましょう:
<interceptor>
<methods class="__CLASS_DIR__A.php">
<method name="foo">
<log-level>INFO</log-level>
<log-message>Transaction init</log-message>
</method>
</methods>
<methods class="__CLASS_DIR__B.php">
<method name="far">
<log-level>DEBUG</log-level>
<log-message>Useless</log-message>
</method>
</methods>
</interceptor>
AT RUNTIME ONLY (XML パーサーがジョブを実行した後) で使用したいのは、次のとおりです。
#Logger.php (its definitely NOT a final version) -- generated by the XML parser
class Logger {
public function __call($name,$args) {
$log_level = args[0];
$args = array_slice($args,1);
switch($method_name) {
case 'foo':
case 'far':
//case .....
//write in log files
break;
}
//THEN, RELAY THE CALL TO THE INITIAL METHOD
}
}
#"dynamic" A.php
class A extends Logger {
public function foo($log_level, $bar) {
parent::foo($log_level, $bar);
echo ' // Hello there !';
}
public function bar($foo) {
echo " $ù$ùmezf$z !";
}
}
#"dynamic" B.php
class B extends Logger {
public function far($log_level, $boo) {
parent::far($log_level, $bar);
echo $boo;
}
}
ここでの大きな課題は、XML パーサーがその仕事を完了した後で、A と B を「動的」バージョンに変換することです。
理想は、A と B のコードを (ファイル内で) まったく変更せずにそれを達成することです。または、少なくとも、プログラムが終了したら元のバージョンに戻る方法を見つけることです。
明確にするために、PHP でメソッド呼び出しをインターセプトする最も適切な方法を見つけたいと考えています。
それについてあなたの考えは何ですか?
PS: そしてもちろん、クライアント コードには NO CONSEQUENCE があってはなりません (傍受が有効になっているかどうかにかかわらず違いはありません)。