2

10 個のメソッドを持つクラスがあり、各メソッドには異なるパラメーターがあるとします。

各メソッドを編集してそのロギング コードを挿入することなく、そのクラスのすべてのメソッドの入力パラメータをログに記録したいと考えています。それをすることはありますか?

4

3 に答える 3

6

マジックでデコレータで包むだけ__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 に実装します。

于 2012-05-17T09:06:42.030 に答える
3

直接ではありません。

すべてのメソッドの名前を変更して、アンダースコアの接尾辞を付けることができます。たとえば、次のようになります。

myFunction() -> _myFunction()

次に、マジック__call()メソッドを追加して、以前の (プレフィックスのない) メソッドへの呼び出しをインターセプトします。次に、リクエストをログに記録し、すべての引数を元のメソッドに渡します。

それは一種の醜いものであり、すべてのメソッド名を変更する必要があります。

于 2012-05-17T09:01:47.243 に答える
1

これを単純化しすぎているかもしれませんが、関数のすべての引数を取得するには、

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つの「制限」は -

注:
この関数は、渡された引数のみのコピーを返し、デフォルトの (渡されていない) 引数は考慮しません。

于 2012-05-17T09:01:41.487 に答える