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