ホームページ  >  記事  >  バックエンド開発  >  PHP の参照、「&」の説明

PHP の参照、「&」の説明

WBOY
WBOYオリジナル
2016-07-25 08:52:011036ブラウズ
  1. $a =& $b
  2. ?>
コードをコピー

これは、$a と $b が同じ変数を指していることを意味します。 注: ここでの $a と $b はまったく同じです。$a が $b を指しているわけではなく、$a と $b が同じ場所を指しているということです。 同じ構文は、参照を返す関数と new 演算子 (PHP 4.0.4 以降) で使用できます。

  1. $bar =& new fooclass();
  2. $foo =& find_var ($bar);
  3. ?>
コードをコピー

注: & 演算子はありませんused オブジェクトのコピーを生成します。クラスで $this を使用すると、そのクラスの現在のインスタンスに適用されます。 & なしで代入するとインスタンス (オブジェクトなど) がコピーされ、そのコピーに $this が適用されますが、必ずしも望ましい結果になるとは限りません。パフォーマンスとメモリ消費の問題のため、通常は 1 つのインスタンスのみで作業する必要があります。

@new などのコンストラクターで @ 演算子を使用してエラー メッセージをオフにすることはできますが、&new ステートメントを使用する場合は効果がありません。これは Zend エンジンの制限であり、解析エラーが発生します。

参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、関数内にローカル変数を作成し、その変数が呼び出しスコープ内の同じコンテンツを参照することによって実現されます。例えば:

  1. function foo (&$var)

  2. {
  3. $var++;
  4. }

  5. $a=5;

  6. foo ($ a);
  7. ?>
コード

をコピーすると$aは6になります。これは、関数 foo 内で変数 $var が $a が指すものと同じものを指しているためです。詳細な説明については、「参照による受け渡し」を参照してください。 参照が行う 3 番目のことは、参照を返すことです。

引用ではないもの 前に述べたように、参照はポインタではありません。これは、次の構成では期待した効果が得られないことを意味します。

  1. function foo (&$var)
  2. {
  3. $var =& $GLOBALS[ "baz "];
  4. }
  5. foo($bar);
  6. ?>
コードをコピーします

これにより、関数の呼び出し時に foo 関数の $var 変数が $bar にバインドされますが、その後 $GLOBALS[ "baz "] に再バインドされます。関数 foo には変数 $bar が存在しないため ($var として表されますが、$var には変数の内容のみが含まれ、呼び出しはありません)、参照メカニズムを通じて関数呼び出しスコープ内の別の変数に $bar をバインドすることはできません。シンボル テーブルの名前と値のバインディング)。

参照によって渡す 関数への参照によって変数を渡すと、関数がその引数の値を変更できるようになります。構文は次のとおりです。

  1. function foo (&$var)

  2. {
  3. $var++;
  4. }

  5. $a=5;

  6. foo ($ a);
  7. // ここで $a は 6 です
  8. ?>
コードをコピー

関数呼び出しには参照シンボルが存在せず、関数定義のみにあることに注意してください。パラメーターを参照によって正しく渡すには、関数定義だけで十分です。

以下は参照によって渡すことができます: 変数 (foo($a)

など)

新しいステートメント (foo(new foobar()) など)

関数から返される参照。例:

  1. function &bar()
  2. {
  3. $a = 5;
  4. return $a;
  5. }
  6. foo(bar());
  7. ?>
コードをコピー

詳細な説明については、リファレンスリターンを参照してください。

他の式は参照渡しできず、結果は未定義です。たとえば、次の参照渡しの例は無効です。

  1. function bar() // 欠落している &

  2. {
  3. $a = 5;
  4. return $a;
  5. }
  6. foo(bar());< に注意してください;/p>
  7. foo($a = 5) // 式、変数ではありません

  8. foo(5) // 定数、変数ではありません
  9. ?>
Copyコード

これらの条件は、PHP 4.0.4 以降のバージョンで利用できます。

引用返信 Reference return は、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用します。参照を返すときは、次の構文を使用します。

  1. function &find_var ($param)
  2. {
  3. return $found_var;
  4. }

  5. $foo =& find_var ($bar) ;

  6. $foo-> x = 2;
  7. ?>
コードをコピー

この例では、find_var 関数によって返されるオブジェクトのプロパティは、参照構文を使用しない場合と同様に、コピーされる代わりに設定されます (トランスレーター: $foo-> x = 2; ステートメントを参照)。

注: パラメーターの受け渡しとは異なり、ここではアンパサンドを両方の場所で使用する必要があります。これは、通常のコピーではなく参照が返されることを示すためと、$foo が通常のコピーではなく参照としてバインドされていることを示すためです。 。

引用を解除 参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例えば:

  1. $a = 1;
  2. $b =& $a;
  3. unset ($a);
  4. ?>
コードをコピー

は$bの設定を解除しません、ただ$a。

これと Unix のリンク解除呼び出しを類推すると、理解が容易になるかもしれません。

引用の位置付け 多くの PHP 構文構造は参照メカニズムを通じて実装されているため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。参照渡しや戻りなどの一部の構造については、すでに上で説明しました。参照を使用する他の構造は次のとおりです:

グローバル引用 global $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。それは以下を行うのと同じです:

  1. $var =& $GLOBALS[ "var "];
  2. ?>
コードをコピー

これは、たとえば、unset $var では global の設定は解除されないことを意味します変数 。

$これ オブジェクト メソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。 興味があるかもしれない記事: 値渡しによるphp参照の詳細な紹介 例を通して、PHP での値渡しと参照渡しの違いを理解します 例を通してPHPアドレス参照の効率の問題を見てみましょう PHP参照アドレスの変数値変更に関する問題



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。