0

誰かが私に次の違いが何であるかを説明してもらえますか?

$var = 'something';
function myFunc(){
    global $var;
    // do something
}

および(注:参照記号&)

$var = 'something';
function myFunc(&$var){
    // do something
}

この2つの方法の違いがわかりません。

アップデート

うーん...私はここで少し混乱していると思います:)

$var = 1;
$var2 = 2;
function myFunction(){
    global $var, $var2;
    $var = $var + $var2;
}

// echo$varはここで3を返します。


$var = 1;
$var2 = 2;
function myFunction(&$a, &$b){
    $a = $a + $b;
}

// echo $ varは、ここでも3を返します。


私はそれらの部分をすでに理解していますが、私が理解していないのは、これら2つのアプローチの違いです。これらの2つのアプローチは技術的に同じものであり、コーダーによる書き込み方法と方法の概念が異なると考えるのは間違っています。それらはPHPによって処理されますか?

私がこれを仮定するのが間違っている場合は、より良い例を提供できれば本当に役立ちます。おそらく、上記のアプローチの1つだけを使用して達成できるものですか?

わかりました。この更新プログラムを書いているときに1つの違いに気づきました。それは、参照を行うときに、関数スコープ内の変数へのポインターを保持しながら、新しい変数名を選択できることです。

4

4 に答える 4

2

2番目のコードブロックでは、外部$varと内部$varは同じ要素です。一方、3番目のコードブロックは最初のコードブロックと同じように動作しますが、送信関数から変数にアクセスして変更することができます。最初のコードブロックでは、変数を内部的に編集したものは、関数のスコープ外では使用できません。


編集内容を質問に一致させるために編集します。

&は、参照によって変数を渡すことを意味します。それを説明する最良の方法は例によるものです。

function test2(&$var) { $var = 2; }
function test() {
   $abc = 1;
   test2($abc);
   echo $abc;
}
test();

このコードは画面に2を出力します。

$var = 0;
function test()
{
   global $var;
   $var = 1;
}
test();
echo $var;

これは1を出力します。

于 2012-04-07T03:59:33.400 に答える
2

$var最初の例では、内部のローカル変数myFunc()は、グローバルスコープ(スーパーグローバルからアクセス可能$GLOBALS)に存在する同じ名前の変数への参照によって割り当てられます。PHPはそれを次のように変換します。

$var = 'something';
$GLOBALS['var'] = &$var;
function myFunc(){
    $var = &$GLOBALS['var'];
    // do something
}

2番目の例では、変数を関数に明示的に渡すため、グローバルスコープから取得されません。

$var = 'something';
$GLOBALS['var'] = &$var;
function myFunc(&$var){
    // do something
}
myFunc($var);

どちらの例もまったく同じ変数を参照しますが、異なるメカニズムを使用します。

于 2012-04-07T04:04:18.833 に答える
1

2つの例の間に技術的な違いはまったくありません。それらは常に同じように動作します。

そのため、他の種類の違いを探すことになります。ここにはかなり重要なコード品質の違いがあります。最初のバージョンでは、呼び出しサイトを見ても、関数がグローバルに依存していることはわかりません。2番目のものではそうなります(パラメーターとして渡されます)。したがって、少なくとも私の本では、2番目の形式が優れています。

さらに、別の違い(この例には当てはまりませんが)は、最初の形式は、変数が最初からグローバルスコープにある場合にのみ使用できることです。2番目はどこでも機能します。

また、これらの両方のメソッドにin/out引数があることも考慮に入れる必要があります。通常、このようなコードを1つの引数だけで記述している場合は(return代わりにout値を使用できるため)、複数の引数が指定されている場合を検討するのは興味深いことです。これは非常にまれであり、コードをさらにわかりやすくするために、参照によって複数の引数を取るよりも、複数の値を持つ配列を返す方がよいと主張することができます。

結論として:

  • 彼らは同じことをします
  • それらの1つを使用する場合は、2番目の形式(より明確でより柔軟)を選択してください
  • 大量の追加コードを記述する必要がない場合は、それらを使用せず、他の方法で実行することを検討してください。
于 2012-04-07T09:18:31.493 に答える
0

1つは値を渡し、もう1つは参照を渡します。

値別:

$var = 'something';
function myFunc($var){
    $var = 'hello';
}
echo $var; //something

参考までに:

$var = 'something';
function myFunc(&$var){
    $var = 'hello';
}
echo $var; //hello

詳細については、PHPマニュアルに参照渡しに関するページがあります:http://php.net/manual/en/language.references.pass.php

グローバルの場合、基本的にグローバルスコープから変数を取得し、関数内で使用します。これは、暗黙的に参照を渡すようなものです。

このページ、特にグローバルセクションでは、次のように説明しています。http: //us.php.net/manual/en/language.variables.scope.php

通常、グローバルは避ける必要があることに注意してください。理由の短いバージョンは、プログラムの状態を知ることを困難にし、後で変更すると予期しない副作用を引き起こす可能性があるためです。

于 2012-04-07T04:02:21.923 に答える