人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: stealthinu
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ARGV PHP コピペ 引数 関数
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●20ポイント

決定的な対策が思い浮かばないので、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;
}
◎質問者からの返答

ありがとうございます。

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

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

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

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


2 ● TheFool
●20ポイント

可変関数を使うとか。

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

$f2 = 'f' ;

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

PECL が使えるなら runkit_function_copy とか。

◎質問者からの返答

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

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

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

function plugin_example_inline()

という動的引数の関数と

function plugin_example_convert()

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

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

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

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

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


3 ● tdoi
●50ポイント ベストアンサー

こういうことですか?

参考: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');
◎質問者からの返答

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

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

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);

}

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ