PHPリファレンス&の使い方詳細解析
2830 ワード
phpの参照(変数や関数、オブジェクトなどの前に&記号を付ける)の役割については、まず次のプログラムを見てみましょう.
プログラムの実行結果:
phpの引用はCのポインタと同じだと誤解する人が多いが、実際にはそうではなく、大きな違いがある.C言語のポインタは配列伝達の過程で明示的に説明しない以外は*で定義する必要があります.一方、phpにおけるアドレスの指向(ポインタ類似)機能は、ユーザ自身が実現するものではなく、Zendコアによって実現され、phpにおける参照は、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされないという「書き込み時コピー」の原理を採用している.
phpはデフォルトで値伝達として使用されます.
プログラムの実行結果:
アドレス転送に変更するには&を追加する必要があります.
プログラムの実行結果:
すなわち,&は$aのアドレスを$bに渡し,この2つの変数は現在1つのメモリの記憶領域を共有している,すなわちそれらの値は同じである.
同じ構文は、関数で使用できます.参照を返し、new演算子で使用できます.
2つ目の参照は、変数を参照で伝達することです.これは、関数内にローカル変数を確立し、呼び出し範囲内で同じ内容を参照することによって実現される.一般的な点は、関数のパラメータがローカル変数の参照であることです.次に例を挙げて説明します.
このコードを実行すると、$aを参照する内容と$bの値の2つのパラメータが関数に渡されます.この関数を実行すると、$aの内容は変更され、$bの内容は変更されません.
PHPリファレンスの3番目の使い方はリファレンスリターンです.この使い方は理解しにくいです.リファレンスリターンは、関数でリファレンスがどの変数にバインドされるべきかを見つけたいときに使用されます.参照を返すときに、この構文を使用します.単純な点を言うか、参照関数の戻りを参照します.ただし、パラメータ伝達とは異なり、関数定義と関数参照の両方に&記号を使用する必要があります.次に例を示します.
この例で$fooに値を割り当てるのは関数find_です.varの戻り参照は$foo->xに値を割り当てるとfind_に与えられますvarの戻りは、単純な付与ではなく、付与を参照します.
PHP参照の最後の使用法は参照位置決めであり、主に2つの応用がある:1つはglobal参照であり、global$varで変数を宣言すると実際にグローバル変数への参照が確立される.つまり$var=&$GLOBALS["var"];同じです.もう1つは$thisの使い方です.1つのオブジェクトのメソッドでは、$thisは常にそのオブジェクトを呼び出す参照です.
$a = 100; // a
$b = &$a; // b, a
echo "$a
";
echo "$b
";
$a++; // a 1
echo "$a
";
echo "$b
";// b, 1,
?>
プログラムの実行結果:
100
100
101
101
phpの引用はCのポインタと同じだと誤解する人が多いが、実際にはそうではなく、大きな違いがある.C言語のポインタは配列伝達の過程で明示的に説明しない以外は*で定義する必要があります.一方、phpにおけるアドレスの指向(ポインタ類似)機能は、ユーザ自身が実現するものではなく、Zendコアによって実現され、phpにおける参照は、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされないという「書き込み時コピー」の原理を採用している.
phpはデフォルトで値伝達として使用されます.
$a = 20;
$b = $a;
$a = $a + 10;
echo $a.' and '.$b;
?>
プログラムの実行結果:
30 and 20
アドレス転送に変更するには&を追加する必要があります.
$a = 20;
$b = &$a;
$a = $a + 10;
echo $a.' and '.$b;
?>
プログラムの実行結果:
30 and 30
すなわち,&は$aのアドレスを$bに渡し,この2つの変数は現在1つのメモリの記憶領域を共有している,すなわちそれらの値は同じである.
同じ構文は、関数で使用できます.参照を返し、new演算子で使用できます.
$bar =& new fooclass();
$foo =& find_var($bar);
?>
2つ目の参照は、変数を参照で伝達することです.これは、関数内にローカル変数を確立し、呼び出し範囲内で同じ内容を参照することによって実現される.一般的な点は、関数のパラメータがローカル変数の参照であることです.次に例を挙げて説明します.
function foo(&$val1, $val2) {
$val1 += 1;
$val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
echo $a;
echo $b;
?>
このコードを実行すると、$aを参照する内容と$bの値の2つのパラメータが関数に渡されます.この関数を実行すると、$aの内容は変更され、$bの内容は変更されません.
PHPリファレンスの3番目の使い方はリファレンスリターンです.この使い方は理解しにくいです.リファレンスリターンは、関数でリファレンスがどの変数にバインドされるべきかを見つけたいときに使用されます.参照を返すときに、この構文を使用します.単純な点を言うか、参照関数の戻りを参照します.ただし、パラメータ伝達とは異なり、関数定義と関数参照の両方に&記号を使用する必要があります.次に例を示します.
function &find_var ($param)
{
/* ...code... */
return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
?>
この例で$fooに値を割り当てるのは関数find_です.varの戻り参照は$foo->xに値を割り当てるとfind_に与えられますvarの戻りは、単純な付与ではなく、付与を参照します.
PHP参照の最後の使用法は参照位置決めであり、主に2つの応用がある:1つはglobal参照であり、global$varで変数を宣言すると実際にグローバル変数への参照が確立される.つまり$var=&$GLOBALS["var"];同じです.もう1つは$thisの使い方です.1つのオブジェクトのメソッドでは、$thisは常にそのオブジェクトを呼び出す参照です.