15

PHP 関数を別の関数でラップできるようにしたいのですが、元の名前/パラメーター リストはそのまま残します。

例えば:

function A() {
    print "inside A()\n";
}

function Wrap_A() {
    print "Calling A()\n";
    A();
    print "Finished calling A()\n";
}

// <--- Do some magic here (effectively "A = Wrap_A")

A();

出力:

Calling A()
inside A()
Finished calling A()
4

5 に答える 5

8

どうやらrunkitが役立つかもしれません。

また、いつでもOOの方法でこれを行うことができます。元の楽しみをクラスに入れ、デコレータを拡張クラスに入れます。インスタンス化して実行します。

于 2009-09-15T06:12:14.010 に答える
2

多分あなたが探しているcall_user_func_array

function wrapA() {
  $args = func_get_args();
  return call_user_func_array('A', $args);
}

PHP 5.3 以降では、次のように言うこともできます。

return call_user_func_array('A', func_get_args());

質問を編集した後、いいえ、これは不可能ですが、いくつかの方法があります。この質問を参照してください: PHP でデコレータを実装する方法は?

于 2009-09-15T05:54:06.463 に答える
1

これは、PHP の関数では実行できません。Perl や Ruby などの他の動的言語では、以前に定義した関数を再定義できますが、そうしようとすると PHP は致命的なエラーをスローします。

5.3 では、無名関数を作成して変数に格納できます。

<?php
    $my_function = function($args, ...) { ... };
    $copy_of_my_function = $my_function;
    $my_function = function($arg, ...) { /* Do something with the copy */ };
?>

または、従来のデコレータ パターンやファクトリを使用して、代わりにクラスを操作することもできます。

于 2009-09-15T06:11:10.127 に答える