4

私はツールボックスを拡張し、さらにいくつかのトリックを学ぼうとしている初心者の開発者のようなものです。最近、「装飾」と呼ばれる Python のパターンに出くわしました。既存の PHP コード ベースがあるので、これを PHP で実装できるかどうか、またはどのように実装できるか疑問に思っていました。

ここに私が意味することの短い例があります:

import time

def log_calls(func):
    def wrapper(*args, **kwargs):
        now = time.time()
        print("Calling {0} with {1} and {2}".format(
            func.__name__,
            args,
            kwargs
        ))
        return_value = func(*args, **kwargs)
        print("Executed {0} in {1}ms".format(
            func.__name__,
            time.time() - now
        ))
        return return_value
    return wrapper

@log_calls
def test1(a,b,c):
    print("\ttest1 called")

@log_calls
def test2(a,b):
    print("\ttest2 called")

@log_calls
def test3(a,b):
    print("\ttest3 called")
    time.sleep(1)

test1(1,2,3)
test2(4,b=5)
test3(6,7)

必ずしも構文的にきれいである必要はありません。すべての言語にはニュアンスがあり、PHP がその構文をサポートしていないことを理解しています。しかし、できるだけ少ないコードを書き直しながら、同じ効果を達成できるようにしたいと考えています。

4

2 に答える 2

2

基本的にいいえ、PHP ではまったくサポートされていません。私の知る限り、将来の PHP バージョンのロードマップにもありません。

興味があり、少し関連性があります。PHP ランドで考えられる最も近いのは、phpUnit を使用してコードをテストする場合です。phpUnit は、メソッドの上の docblock タイプのコメントで参照を使用して、独自の使用のためにこれらの行に沿って何かを実装します。例えば:

/**
 * @dataProvider myProviderFunc
 */
public function myTestFunc($argsFromProvider) {
    ....
}

public function myProviderFunc() {
    return array(....);
}

したがって、phpUnit が を呼び出したい場合myTestFunc()、最初に を呼び出しmyProviderFunc()、その関数の出力を に渡しますmyTestFunc()

これは、あなたが説明しているデコレータの構文に近いと思いますが、まったく同じではありません。ただし、これは標準の PHP 構文ではありません。phpUnit は、これらすべてを実装しています。テストを実行する前に、ソース コードを読み取り、コメント ブロックを解析する際に大量の前処理を行うため、正確には効率的ではありません。単体テスト ツールには適していますが、運用システムには適していません。

しかし、いいえ、あなたの質問に対する簡単な答えは、あなたが望むことは PHP では実行できないということです。ごめん。

于 2012-11-29T16:52:25.637 に答える
1

PHP にはデコレータ パターンの構文サポートはありませんが、自分で実装することを妨げるものは何もありません。

あなたの質問に関連するかもしれない次の議論を調べることができます:

これは、PHP を含む複数の言語による UML 図とコード サンプルを含む別のリソースです。

于 2012-11-29T17:25:28.083 に答える