次のようなコードがよく見られます (CI フレームワークのソース コードから):
$class =& load_class('a','b');
その中の「&」が参照を参照していることは誰もが知っていますが、その役割は何でしょうか?どのような問題を解決できますか?これらの質問によって、「リファレンスリターン」について理解が始まります。
参照リターン
マニュアルには次のように書かれています: 参照リターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用します。パフォーマンスを向上させるために戻り参照を使用しないでください。エンジンはそれ自体を最適化するのに十分な機能を備えています。正当な技術的理由がある場合にのみ参照を返してください。参照を返すには、次の構文を使用します:
<?php class foo { public $value = 42; public function &getValue() { return $this->value; } } $obj = new foo; // $myValue is a reference to $obj->value, which is 42. // $myValue 是 $obj->value 的引用,它们的值都是 42 $myValue = &$obj->getValue(); // 对 $obj->value 重新复制,会影响到 $myValue 的值 $obj->value = 2; // prints the new value of $obj->value, i.e. 2. echo $myValue; // 程序输出 2 ?>
この例では、getValue() 関数によって返されるオブジェクトの property には、参照構文を使用しない場合と同様に、コピーされずに値が割り当てられます。
パラメータの受け渡しとは異なり、ここでは両方の場所でアンパサンドを使用する必要があります。これは、通常のコピーではなく参照が返されることを示し、また $myValue が通常の代入ではなく参照としてバインドされていることを示します。
return ($this->value); のような関数から参照を返そうとした場合、参照される変数ではなく 式 の結果を返そうとしているため、これは機能しません。参照変数を返すことができるのは関数からのみであり、他に方法はありません。コードが動的式または新しい 演算子 の結果を返そうとすると、PHP 4.4.0 および PHP 5.1.0 では E_NOTICE エラーが生成されます。
分かるようで分からない?それでは、プログラムを書き直して、通常の関数に変えてみましょう:
<?php class foo { public $value = 42; public function getValue() { return $this->value; } } $obj = new foo; $myValue = $obj->getValue(); $obj->value = 2; echo $obj->value; // 程序输出 2 echo $myValue; // 程序输出 42 ?>
これで、「関数を使用して参照をバインドする必要がある変数、関数 &getValue を使用したい場合に、参照戻りが使用されます。」という文が理解できました。 () は、参照をメンバー変数 $value にバインドします。通常、 $obj = new foo; によって生成される $obj はコピーであり、そのメンバー変数 $value は関数 getValue() との「エイリアス」 (参照) 関係を持ちません。
以下の簡単な例を見て、参照の戻り値を理解してください。
<?php function &test() { // 声明一个静态变量 static $b = 0; $b = $b+1; echo $b; return $b; } $a = test();//这条语句会输出 $b 的值为 1 $a = 5; $a = test();//这条语句会输出 $b 的值为2 $a = &test();//这条语句会输出 $b 的值为3 $a = 5; $a = test();//这条语句会输出 $b的值 为6 ?>
プログラムの実行結果: 1236
上の例を使って説明すると、このように関数を呼び出すと、 $a = test() は関数の値を $a に代入するだけで、$a への変更は発生しません。関数内の $b。
そして $a = &test() を通じて関数を呼び出すと、その関数は $b 変数のメモリ アドレスを $a 変数のメモリ アドレスと同じ場所に返すことです。つまり、同等の効果が得られます ($a=&$b)。したがって、$a の値を変更すると、$b の値も変更されます。したがって、
$a = &test(); $a = 5;
を実行すると、$bの値は5になります。
理解を深めるための別のプログラム例:
<?php /* ** 值传递和引用传递,值传递传递的是值的一个复本,引用传递传递的是值指向的内存地址 */ // 函数的引用,定义时也要加上 & function &func($a,$b){ // 这里为了更直观看到效果,定义一个静态变量 static $result = 0; $result+=$a+$b; echo $result.'<br />'; return $result; } $a = $b = 10; // PHP里这样写函数的引用调用,和调用普通函数没有区别(只是将函数的返回值复制给$c这个变量,$c做任何改变不会影响上面函数中的$result) // 要记住:PHP里的函数引用定义及调用都要在函数名前加上 & $c = func($a,$b); // 第一次执行func(),其静态变量$result的值变为 20(10+10) // 改变$c的值,不会对下面一行语句产生影响 $c = 666; // 第二次执行func(),其静态变量$result的值变为 40(20+10+10) $c = func($a,$b); echo '<hr />'; // 这样才是PHP中引用函数的调用方式 $d = &func($a,$b); // 第三次执行func(),其静态变量$result的值变为 40(40+10+10) $d = 888; // 第四次执行func(),其静态变量$result的值变为 908(888+10+10) $d = func($a,$b); ?>
以上がPHPの「参照リターン」とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。