« リファレンス渡し
リファレンスの解除 »

リファレンスを返す

リファレンスを返すことは、結合する変数を見付けるために関数を使用し たい場合に便利です。パフォーマンスを向上させるためだけの目的で この機能を用いることはやめてください。 そのようなことをしなくても、PHP エンジンが自動的に最適化を行います。 リファレンスを返すのは、そうすべき妥当な理由がある場合に限られます! リファレンスを返す場合、次の構文を使用して下さい。

<?php

class Foo {
    public $value = 42;

    public function &getValue()
    {
        return $this->value;
    }
}

$obj = new Foo();
$myValue = &$obj->getValue(); // $myValue は $obj->value へのリファレンス、つまり 42 となります
$obj->value = 2;
echo $myValue;                // $obj->value の新しい値である 2 を表示します
この例では、関数 getValue により返された オブジェクトのプロパティが、設定されます。リファレンス構文を 使用しない場合のようにコピーとなるわけではありません。

注意:

パラメータを渡す場合と異なり、ここでは、通常のようにコピーでは なくリファレンスで戻り値を指定し、リファレンス結合を指定するために 両方の場所で & を使用する必要があります。 $myValue について行われたのは、通常の代入ではありません。

注意:

以下のような形式で関数からリファレンスを返そうとした場合、 return ($this->value); これは、あなたが望んでいるようには 動作しません。変数ではなく 式 の結果をリファレンスで返そうとしているからです。 関数からリファレンスで返せるのは変数だけであり、 それ以外は返せません。

返されたリファレンスを使うには、リファレンスを代入しなければなりません。

<?php

function &collector()
{
  static $collection = array();
  return $collection;
}

$collection = &collector();
// $collection は、関数内の static な配列を指すリファレンスになりました。

$collection[] = 'foo';

print_r(collector());

上の例の出力は以下となります。

Array
(
    [0] => foo
)

注意:

$collection = collector(); のような形で、 & を使わずに代入が行われると、 変数 $collection は値のコピーを受け取ります。 関数から返されたリファレンスではありません。

返されたリファレンスを、リファレンスを要求する別の関数に渡すには、 この構文を使います。
<?php

function &collector()
{
  static $collection = array();
  return $collection;
}

array_push(collector(), 'foo');

注意:

array_push(&collector(), 'foo'); は 動かないことに注意しましょう。致命的なエラーとなります。

関連キーワード:
リファレンス   collection   collector   変数   return   myValue   構文   getValue   コピー   代入   static   結合   通常   push   解除   便利   パフォーマンス   向上   目的   エンジン   自動的   最適化   妥当   理由   プロパティ
関連する関数・ページ:
language.references.arent   language.references.pass   language.references   language.references.whatare   language.references.spot   language.references.unset