2

まあ、私は参照が何であるかを知っており、それがいつ使用されるかは明らかです。

私が本当に得られないことの1つは、関数を参照渡しする方が良い場合です。

<?php

//right here, I wonder why and when
function &test(){

}

混乱を避けるために、参照を理解する方法としていくつかの例があります。

<?php

$numbers = array(2,3,4);

foreach ($numbers as &$number){
   $number = $number * 2;
}

// now numbers is $numbers = array(4,6,8);


$var = 'test';
$foo = &var; //now all changes to $foo will be affected to $var, because we've assigned simple pointer 



//Similar to array_push()
function add_key(&$array, $key){
  return $array[$key];
}

//so we don't need to assign returned value from this function
//we just call this one

$array = array('a', 'b');

add_key($array,'c');
//now $array is ('a', 'b', 'c');

「参照による関数の受け渡し」の使用を除いて、参照を使用するすべての利点は明らかです。

質問:いつ関数を参照渡しするか (ここで回答を検索しましたが、まだこれを把握できません) ありがとう

4

2 に答える 2

3

これは参照によって返される関数です。「参照によって関数を渡す」という用語は少し誤解を招きます。

function &test(){
    return /* something */;
}

使用例は通常の参照とほとんど同じですが、一般的ではありません。(不自然な) 例として、配列内の要素を検索する関数を考えてみましょう。

$arr = array(
    array('name' => 'John', 'age' => 20),
    array('name' => 'Mary', 'age' => 30),
);

function &findPerson(&$list, $name) {
    foreach ($list as &$person) {
        if ($person['name'] == $name) {
            return $person;
        }
    }
    return null;
}

$john = &findPerson($arr, 'John');
$john['age'] = 21;

print_r($arr); // changing $john produces a visible change here

実際に見てください

上記の例では、データ構造 (実際には、この配列よりもはるかに複雑になる可能性があります) 内の項目を検索するコードを、再利用可能な関数にカプセル化しました。戻り値を使用して元の構造自体を変更する場合は、関数から参照を返す以外に選択肢はありません (この特定のケースでは、インデックスを配列に返すこともできますが、インデックスを持たない構造について考えてください)。 、例: グラフ)。

于 2012-06-19T07:35:58.320 に答える
1

参照を返すということですか?

簡単な例は次のとおりです。

function &test(&$a){
  return $a;
}

$a = 10;
$b = &test($a);
$b++;

// here $a became 11
var_dump($a);
于 2012-06-19T07:33:21.750 に答える