ここから本文です

PHPの可変長引数の関数での引数の参照渡しについて教えてください。 下記のよう...

gou********さん

2016/10/2521:12:51

PHPの可変長引数の関数での引数の参照渡しについて教えてください。

下記のような可変長引数の関数があるとします。引数は全部配列です。

function foo($arr [, $arr2 [, $arr3, ...]]) {
}

ここで最初の引数$arrだけ、参照渡しで配列のポインタを欲しいと思い、下記のようにスクリプトを書いてみました。

function foo($arr [, $arr2 [, $arr3, ...]]) {
$mainArr = &func_get_arg(0);

以降 $mainArrをの内容を書き換える処理

var_dump($mainArr);
}

しかし、残念ながら、この関数を実行する前後で、引数に指定した配列の内容に変化はありませんでした。ただ、関数終了時にvar_dump()の内容を見ると確かに$mainArrの内容は書き変わっているので、$mainArrを書き換える処理に間違いはなく、1番目の引数$arrが参照渡しできていないのが問題ではないかと思っています。

*当然ですが、

$mainArr = &func_get_arg(0);

の部分を

$argList = func_get_args();
$mainArr = &$argList[0];

としても結果は同じで、
これも当然ですが、

$argList = func_get_args();
$mainArr = &array_shift($argList);

とするとエラーになります。

こういった可変長引数の関数で、第1引数だけ、参照渡しで受け取る方法はないでしょうか?
詳しい方、よろしくお願いいたします。

閲覧数:
75
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

mpywさん

2016/10/2521:45:28

func_get_argsやcall_user_func_arrayという旧来のPHPの関数は捨てて,PHP5.6から実装されている「...」演算子を使ってください。

PHP標準のarray_push関数に引数を受け流すmy_array_push関数を書いてみます。またここでは元の仕様に乗っ取り,要素数は最低1必要であるとします。

function my_array_push(array &$array, $value1, ...$values)
{
    return array_push($array, $value1, ...$values);
}

  • mpywさん

    2016/10/2521:51:14

    というか,「最初の引数だけを参照で受け取りたい」だけならPHP5.5以前でも問題ないですね。call_user_func_arrayは参照で渡せないのでどうしようもないですが。

    // 中身も自前で書くならOK
    function my_array_push(array &$array) {
        $args = func_get_args();
        array_shift($args);
        foreach ($args as $i => $arg) {
            $array[] = $arg;
        }
        return count($array);
    }

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2016/10/29 21:04:29

いつもありがとうございます!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる