PHPで、引数が動的な関数で、全く同じことをする関数を作る方法を教えてください。つまり別名関数を引数が動的な場合で作りたいのです。

もちろん同じ内容をコピペすれば可能ですが、それはやりたくないので、その関数をそのまま呼びだしたいのですが、引数が固定ではなくて動的で、func_get_argsを使って引数を処理しているので、そのまま渡すというのがどうやったらよいのかわかりません。
function f() { $argv=func_get_args(); ... } というような関数があるときに、function f2()を呼んだらそのままf()の処理をしてくれる、という感じです。

回答の条件
  • 1人5回まで
  • 登録:2009/08/21 14:21:57
  • 終了:2009/08/21 17:31:13

ベストアンサー

id:tdoi No.3

tdoi回答回数174ベストアンサー獲得回数752009/08/21 17:00:51

ポイント50pt

こういうことですか?

参考:http://jp2.php.net/call_user_func_array

function f()
{
  print_r (func_get_args());
}

function f2()
{
  $args = func_get_args();
  call_user_func_array('f', $args);
}

f2('a');
f2('a', 'b');
f2('a', 'b', 'c');
id:stealthinu

おおおお、出来ました!ありがとうございます。いやー、これは自分で調べててもわからないわあ…

ちなみに返値がある関数なので

function plugin_example_inline()

{

return (func_get_args());

}

function plugin_example_convert()

{

$args = func_get_args();

return call_user_func_array('plugin_example_inline', $args);

}

という感じで、うまく動くことが確認できました。

2009/08/21 17:29:49

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/08/21 15:22:46

ポイント20pt

決定的な対策が思い浮かばないので、3つの案を示します。


引数の数が動的なのですから、f2 にはきちんと引数を渡してやらなければなりません。

たとえば f1($a, $b, $c) が呼び出されて、そこから f2 を呼び出す場合、f2 にとっては、f2($a, $b, $c) で呼び出されたのか、f2($a, $b) で呼び出されたのか知る術がありません。

f2($a, $b, $c) と、必要十分な変数を渡してやるのが1つの案です。


2つめの案は、引数をグローバル変数にしてしまうことです。

ただ、これを行うと再帰呼び出しができなくなります。


3つめの案は、引数を1つの配列にまとめてしまうことです。

関数側では、func_get_args を使って取り出します。

たとえば、以下のようなイメージです。

$arr = compact($a, $b, $c);
f1($arr);

function f1($arr) {
    $a = $arr['a'];
    $b = $arr['b'];
    ....
    f2($arr);
    ....
    return $hoge;
}
id:stealthinu

ありがとうございます。

perlでいうところの「@_」みたいなのがPHPにもあって、それをf2に渡してやればいいのかな?と思っていたのですが、そう簡単なものではないのですね。

PukiWikiのプラグインで使いたいので引数の渡し方はすでに規定されているため、2と3の案は使えないのです。

1案のものを拡張して、func_get_argsで取得した引数をforeachみたいなのでまわして、全引数をうまいことf2へ渡すことはできないでしょうかね。

evalみたいなものを使わないと無理でしょうか。

2009/08/21 15:52:05
id:TheFool No.2

TheFool回答回数5ベストアンサー獲得回数02009/08/21 15:35:42

ポイント20pt

可変関数を使うとか。

<?php
function f() {
 print_r(func_get_args()) ;
}

$f2 = 'f' ;

$f2(123, 'abc', 'あいう', array('hatena', 'question')) ;
?>

PECL が使えるなら runkit_function_copy とか。

id:stealthinu

うーん、とってもいい感じなのすが…

呼び出したいのはあくまで普通の関数なのです。

後からの説明で申し訳ないのですが、PukiWikiのプラグインで使いたいため、関数名がある程度規定されているのです。

function plugin_example_inline()

という動的引数の関数と

function plugin_example_convert()

という関数とをコピペせずに全く同じ動作をさせたいのです。

PECL知らなかったのですが、そういうPHPを拡張するライブラリがあるのですね。

まさにこのrunkit_function_copyがあればよいです。

ただ、PukiWiki用のプラグインとして汎用的に使えるようにしたいので、できれば素のPHPでできるようにしたいです。

そうでなければ、嫌ですが、コピペのほうが汎用性が高くなるのでそっちにすると思います。

2009/08/21 16:10:10
id:tdoi No.3

tdoi回答回数174ベストアンサー獲得回数752009/08/21 17:00:51ここでベストアンサー

ポイント50pt

こういうことですか?

参考:http://jp2.php.net/call_user_func_array

function f()
{
  print_r (func_get_args());
}

function f2()
{
  $args = func_get_args();
  call_user_func_array('f', $args);
}

f2('a');
f2('a', 'b');
f2('a', 'b', 'c');
id:stealthinu

おおおお、出来ました!ありがとうございます。いやー、これは自分で調べててもわからないわあ…

ちなみに返値がある関数なので

function plugin_example_inline()

{

return (func_get_args());

}

function plugin_example_convert()

{

$args = func_get_args();

return call_user_func_array('plugin_example_inline', $args);

}

という感じで、うまく動くことが確認できました。

2009/08/21 17:29:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません