リファレンスが行うことは何ですか?

PHPのリファレンスにより二つの変数が同じ内容を参照することが可能で す。つまり、以下のようなものを実行した場合です。

<?php
$a
=& $b;
?>

この場合、$a$bは同じ変数を 指します。

注意: ここで、$a$bは完全に同じ で、$a$bを指しているわけ ではなく、その逆でもありません。$a$bは同じ場所を指しているのです。

注意: If array with references is copied, its values are not dereferenced. This is valid also for arrays passed by value to functions.

同じ構文は、リファレンスを返す関数やnew演算子で も使用可能です。(PHP 4.0.4 以降)

<?php
$bar
=& new fooclass();
$foo =& find_var($bar);
?>

警告

If you assign a reference to a variable declared global inside a function, the reference will be visible only inside the function. You can avoid this by using the $GLOBALS array.

例 21-1. Referencing global variables inside function

<?php
$var1
= "Example variable";
$var2 = "";

function
global_references($use_globals)
{
    global
$var1, $var2;
    if (!
$use_globals) {
        
$var2 =& $var1; // visible only inside the function
    
} else {
        
$GLOBALS["var2"] =& $var1; // visible also in global context
    
}
}

global_references(false);
echo
"var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo
"var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
?>
Think about global $var; as a shortcut to $var =& $GLOBALS['var'];. Thus assigning other reference to $var only changes the local variable's reference.

注意: &演算子を使用しないとオブジェクトのコピーが 生成されます。もし$thisをクラスの中で使用すると、 この変数は、そのクラスの現在のインスタンスを指します。 &無しに値を割り当てるとインスタンス(つまりオブジェクト) のコピーが生成され、$thisはコピーを指すことに なります。この挙動が望ましくない場合もあるでしょう。というのも普通は パフォーマンスとメモリ効率の面から考えて動作するインスタンスは一つ で十分だからです。

@newのように使用することにより、コンストラクタ におけるエラーを@演算子を使用することが できますが、これは、&new命令を用いた場合は 動作しません。これは、Zend Engineの制限であり、パースエラーを 発生します。

リファレンスの第2の使用法は、変数のリファレンス渡しです。この場合、 関数でローカル変数が作成され、コール側の変数と同じ内容へのリファレ ンスとなります。例を示します。

<?php
function foo(&$var)
{
  
$var++;
}

$a=5;
foo($a);
?>

この結果、$a は 6となります。これは、関数 fooの中では、変数$var$aと同じ内容を指しているためです。 リファレンス渡し に関するより詳細な説明も参照ください。

リファレンスの第3の使用法は、 リファレンスによる返り値 です。