10 個のメソッドを持つクラスがあり、各メソッドには異なるパラメーターがあるとします。
各メソッドを編集してそのロギング コードを挿入することなく、そのクラスのすべてのメソッドの入力パラメータをログに記録したいと考えています。それをすることはありますか?
10 個のメソッドを持つクラスがあり、各メソッドには異なるパラメーターがあるとします。
各メソッドを編集してそのロギング コードを挿入することなく、そのクラスのすべてのメソッドの入力パラメータをログに記録したいと考えています。それをすることはありますか?
マジックでデコレータで包むだけ__call
http://ideone.com/n9ZUD
class TargetClass
{
public function A($a, $b) {}
public function B($c, $d) {}
public function C($e, $f) {}
}
class LoggingDecorator
{
private $_target;
public function __construct($target)
{
$this->_target = $target;
}
public function __call($name, $params)
{
$this->_log($name, $params);
return call_user_func_array(array($this->_target, $name), $params);
}
private function _log($name, $params)
{
echo $name . ' has been called with params: ' . implode(', ', $params) . '<br>';
}
}
$target = new TargetClass();
$logger = new LoggingDecorator($target);
$logger->A(1, 2);
$logger->A(3, 4);
このアプローチの唯一の欠点は、装飾されたクラスの型が失われることです。たとえば、型のヒントを満たすことができなくなります。それが懸念される場合は、TargetClass のインターフェイスを抽出して、LoggingDecorator に実装します。
直接ではありません。
すべてのメソッドの名前を変更して、アンダースコアの接尾辞を付けることができます。たとえば、次のようになります。
myFunction() -> _myFunction()
次に、マジック__call()
メソッドを追加して、以前の (プレフィックスのない) メソッドへの呼び出しをインターセプトします。次に、リクエストをログに記録し、すべての引数を元のメソッドに渡します。
それは一種の醜いものであり、すべてのメソッド名を変更する必要があります。
これを単純化しすぎているかもしれませんが、関数のすべての引数を取得するには、
func_get_args();
関数の引数リストを含む配列を返します
http://www.php.net/manual/en/function.func-get-args.php
<?php
function foo() {
$args = func_get_args();
var_export($args);
}
foo('arg1', 'arg1');
?>
それはこのようなものを出力します-
array (
0 => 'arg1',
1 => 'arg2',
)
ここに追加するいくつかの注意事項があります - あなたは私が提供したドキュメントのリンクを読むべきです - 1つの「制限」は -
注:
この関数は、渡された引数のみのコピーを返し、デフォルトの (渡されていない) 引数は考慮しません。