プロが教える店舗&オフィスのセキュリティ対策術

以下のように、関数を呼び出すときに引数の個数を可変にするスマートなやり方は、何かあるでしょうか?
$arrは配列
func1($arr) {
// $arrの個数が3個のとき
func2($arr[0], $arr[1], $arr[2]);
// $arrの個数が5個のとき
func2($arr[0], $arr[1], $arr[2], $arr[3], $arr[4]);
}

例えば、
$args = '$arr[0], $arr[1], $arr[2]'
としたとき、
func2($args)
とすると、func2には文字列として渡りますが、これを上のように
func2($arr[0], $arr[1], $arr[2])
として呼びたいです。

こんな方法何かあるでしょうか?

よろしくお願いします。

A 回答 (4件)

疑問の多い質問だがそれは置いといて、希望してるであろうことを素直に考えてみた。

といってもそれ自体理解してるかどうかも怪しいのだが。

呼出し部分のコードを文字列として生成。それをevalで実行というのが考えられる。次のがそのサンプル。

# ここから
<?php
function func2($arg1, $arg2, $arg3)
{
echo "\$arg1:$arg1, \$arg2:$arg2, arg3:\$$arg3\n";
}
$arr = array('りんご', 'バナナ', 'メロン');
$args = '';
for ($i = 0; $i < count($arr); $i++){
$args .= "\$arr[$i],";
}
$code_str = 'func2(' .rtrim($args, ',') .');';
var_dump($code_str); # debug こういう文字列を作って
eval($code_str); # evalで実行させる
?>
# ここまで

当然だがこういう呼びかたでfunc2がうまく動くというのが前提。実際にどうなるかはfunc2の中身がわからないので保証できない。

func2側で対応するという話なら既に回答があるとおり可変長の引数や引数のデフォルト値を決める方法で対応すればいいと思います。
    • good
    • 0
この回答へのお礼

お忙しい中、ご回答どうもありがとうございます。

教えていただいた方法で解決することができました!!

今回のfunc2()は既に可変長引数を受け取るようになっているのですが、第1引数をSQL文、第2引数以降をSQL文に渡すパラメータとして受け取る仕様の関数だったので、どうしても呼び出し側でパラメータをばらして渡す必要がありました。
このテクニックは、今後も役立ちそうです。

本当にどうもありがとうございました。

お礼日時:2008/10/23 10:46

#1ですが、意味わかんなくなってきました。



> func2()を呼び出す部分の引数を可変にしたいのです。
つまりfunc2()の仮引数が可変であれば良い、という事とは別なのでしょうか?
func2()が可変引数に対応した記述で定義されていない限り、可変引数を
利用した呼び出しは不可能だと思いますよ。

もしくは渡したい値がfunc1()実引数の配列の中身と決まっているのなら、
#2さんの仰るとおり、配列をそのまま渡すべきです。
func2()の仮引数に明示的に意味合いが存在し、かつそれを別々の仮引数として
定義したい場合に限り、func2()を先に述べたような方法で可変引数として
対応可能な定義にした方が良いかと思います。
(もしくは渡される実引数の数にMAX値が存在するならば、#2で紹介のある通り、
デフォルト値を有する仮引数の定義方法)

いずれにしても、func2()はもう出来上がっているからいじりたくない、
func2()を呼び出す所だけを可変にしたいという考え方では不可能だと思います。
何せfunc2()がその呼び出し方法に対応した定義と処理ではないのですから。
func2()の中身は絶対にいじりたくないんだ!という事であれば、func2()を
呼び出す前にfunc2()の呼び出し方に変換してくれるような関数を
ワンクッション噛ませないといけませんね。
    • good
    • 0
この回答へのお礼

お忙しい中、ご回答ありがとうございました。

#4の方の方法で解決することができました。

ありがとうございました。

お礼日時:2008/10/23 10:47

func2にも$arr(配列)のまま渡して、func2の受け側で配列要素数を判定して処理するほうが素直ですが、



func2($arr[0], $arr[1], $arr[2])として引数の数を可変にしたいのなら

function func2($a1,$a2=null,$a3=null,$a4=null,$a5=null,$a6=null){
のようにfunc2を定義すればよいです。
    • good
    • 0
この回答へのお礼

お忙しい中、ご回答ありがとうございました。

今回func2()は、既に可変長引数を受け取ることができるようになっているのですが、#4の理由で、呼び出し側で引数をばらす必要がありました。

ありがとうございました。

お礼日時:2008/10/23 10:50

PHPって確か引数の指定が強制されないんですよね。


なので
function func2() {
 switch (func_num_args()) {
  case 1:
   echo func_get_arg(0);
   break;
  case 2:
   echo func_get_arg(0);
   echo func_get_arg(1);
   break;
  case 3:
   echo func_get_arg(0);
   echo func_get_arg(1);
   echo func_get_arg(2);
   break;
 }

func2($arr[0], $arr[1], $arr[2]);

みたく出来ちゃいます。

http://jp2.php.net/manual/ja/function.func-get-a …
左のリストに似たような関数名のものが全てそれを実現するのに
利用されるであろう関数群になります。

ただこれをすると、PDTなどの統合開発環境を利用している環境で、
当該関数を呼び出そうとして出てくるはずの引数のリストが
出てきません。
(関数定義で引数がないので当然ですが)

PHPは他の言語と同等のオーバーロードがサポートされていませんので、上記方法か
__call()を利用する方法くらいで対応するしかありませんね。
http://jp2.php.net/manual/ja/language.oop5.overl …
    • good
    • 0
この回答へのお礼

ご回答どうもありがとうございます。

すいません、私の質問の仕方が良くなかったようなのですが、今回はfunc2()の中身ではなく、func2()を呼び出す部分の引数を可変にしたいのです。
つまり、func1()に渡ってきた配列の要素数によって、
func2($arr[0], $arr[1], ……, $arr[n-1]);
という形でfunc2()をコールしたいのです。

もし何か方法をご存知でしたら、よろしくお願いします。

お礼日時:2008/10/22 23:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!