PHP では、& 記号はコピーではなく変数への参照を渡します。参照とは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは、シンボル テーブルのエイリアスである C のポインターとは異なります。 PHP では、変数名と変数の内容が異なるため、同じ内容が異なる名前を持つ可能性があることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムにおける緊密な接続と考えることができます。
PHP 参照を使用すると、2 つの変数を使用して同じコンテンツを指すことができます。つまり、次のようにすると:
<?php $a =&$b ?>
これは、$a と $b が同じ変数を指すことを意味します。
注: ここで $a と $b はまったく同じです。$a が $b を指しているわけではなく、$a と $b が同じ場所を指しているということです。
同じ構文は、参照を返す関数と新しい 演算子 (PHP 4.0.4 以降) で使用できます:
<?php $bar =& new fooclass(); $foo =& find_var ($bar); ?>
注: & 演算子を使用しないと、作成されるオブジェクトのコピーが作成されます。 。クラスで $this を使用すると、そのクラスの現在のインスタンスに適用されます。 & なしの代入はインスタンス (オブジェクトなど) をコピーし、$this はそのコピーに作用しますが、必ずしも望ましい結果になるとは限りません。パフォーマンスとメモリ消費の問題のため、通常は 1 つのインスタンスのみで作業する必要があります。
@new などの @ 演算子を使用して、コンストラクター内の エラー メッセージをオフにすることができますが、これは &new ステートメントを使用する場合には効果がありません。これは Zend エンジンの制限であり、解析エラーが発生します。
参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、関数内にローカル変数を作成し、その変数が呼び出しスコープ内の同じコンテンツを参照することによって実現されます。例:
<?php function foo (&$var) { $var++; } $a=5; foo ($a); ?>
は $a を 6 に変換します。これは、関数 foo で変数 $var が $a が指すものと同じものを指しているためです。詳細な説明については、「参照による受け渡し」を参照してください。
参照が行う 3 番目のことは、参照を返すことです。
参照ではないもの
前に述べたように、参照はポインタではありません。これは、次の構造では期待した効果が得られないことを意味します:
<?php function foo (&$var){ $var =& $GLOBALS["baz"]; } foo($bar); ?>
これにより、関数の呼び出し時に foo 関数の $var 変数が $bar にバインドされますが、その後 $GLOBALS [ 「バズ」] 上。関数 foo には変数 $bar が存在しないため ($var として表されますが、$var には変数の内容のみが含まれ、呼び出しはありません)、参照メカニズムを通じて関数呼び出しスコープ内の別の変数に $bar をバインドすることはできません。シンボル テーブルの名前と値のバインディング)。
参照渡し
参照によって変数を関数に渡すことができ、関数がその引数の値を変更できるようになります。構文は次のとおりです。
<?php function foo (&$var) { $var++; } $a=5; foo ($a); // $a is 6 here ?>
関数呼び出しには参照記号はなく、関数定義のみにあることに注意してください。パラメーターを参照によって正しく渡すには、関数定義だけで十分です。
以下のものは参照によって渡すことができます:
foo($a) などの変数
foo(new foobar()) などの新しいステートメント
関数から返される参照、たとえば:
<?php function &bar() { $a = 5; return $a; } foo(bar()); ?>
詳細については、を参照してください。参照により返します。
その他の 式 は参照渡しできず、結果は未定義です。たとえば、次の参照渡しの例は無効です:
<?php function bar(){ // Note the missing & $a = 5; return $a; } foo(bar()); foo($a = 5) // 表达式,不是变量 foo(5) // 常量,不是变量 ?>
これらの条件は、PHP 4.0.4 以降のバージョンで利用できます。
リファレンスリターン
リファレンスリターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用されます。参照を返すときは、次の構文を使用します:
<?php function &find_var ($param){ /* ...code... */ return $found_var; } $foo =& find_var ($bar); $foo->x = 2; ?>
この例では、find_var 関数によって返されるオブジェクトのプロパティはコピーされずに設定されます (トランスレータ: $foo->x = 2; ステートメントを参照)。 、参照構文を使用しないのと同じです。
注: パラメーターの受け渡しとは異なり、ここではアンパサンドを両方の場所で使用する必要があります。これは、通常のコピーではなく参照が返されることを示すためと、$foo が通常のコピーではなく参照としてバインドされていることを示すためです。 。
参照解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:
<?php $a = 1; $b =& $a; unset ($a); ?>
は $b の設定を解除せず、$a のみを設定解除します。
これと Unix のリンク解除呼び出しを類推すると、理解が容易になるかもしれません。
参照の位置付け
多くの PHP 構文構造は参照メカニズムを通じて実装されるため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。参照渡しや戻りなどの一部の構造については、すでに上で説明しました。参照を使用するその他の構造は次のとおりです。
グローバル参照
グローバル $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それはこれを行うのと同じです:
<?php $var =& $GLOBALS["var"]; ?>
这意味着,例如,unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
以上がPHP で関数を定義するとき、関数名の前に「&」記号を追加することは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。