PHP で参照割り当てを使用するには、元のオブジェクトの前に & を追加するだけです $a = &$b; 実際、PHP における参照は、同じ値を指す異なる名前を持つ 2 つの変数です。
引用とは
PHP でのクォートとは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは C ポインターとは異なり、参照はシンボル テーブルのエイリアスです。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムのハードリンクと考えることができます。
1: 変数への参照
コードは次のとおりです |
コードをコピー |
$a =100;
$b = &$a;
echo $b; // ここに 100 を出力します
echo $a; // ここでは 100 が出力され、$a と $b の値が両方とも 100 であることを示します。
$b= 200;
echo $a; //200 がここに出力されます
echo $b; //200 がここに出力され、同じアドレスを使用していることがわかります。どちらかを変えるともう一方も変わります。
?>
|
2: 関数内で値を渡します。
コードは次のとおりです |
コードをコピー |
関数 main($a,$b){
$b= $a+100;
$b を返します;
}
main(55,&$b); //ここでの $b は、実際にはそのメモリ アドレスを関数 main の $b パラメータに渡し、パラメータ $b の変更を通じて外側の $b の値を変更します。
echo $b; //155 がここに出力されます
?>
|
3: オブジェクトの参照渡し
オブジェクトの参照
コードは次のとおりです |
コードをコピー |
クラスクラブ{
var $name="レアル・マドリード";
}
$b=新しいクラブ;
$c=$b;
echo $b->name;// ここにレアル・マドリードを出力します
echo $c->name;//レアル・マドリードがここに出力されます
$b->name="ロナウド";
echo $c->name;//ロナウド をここに出力
?> |
引用解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:
コードは次のとおりです |
コードをコピー |
$a = 'ロナウド'
$b =&$a;
設定を解除 ($a);
?>
|
$b の設定は解除されず、$a のみが解除されます。
例、参照渡し
test1.php
コードは次のとおりです |
コードをコピー |
/**
* 参考までに渡します
次のコンテンツは参照によって渡すことができます:
foo($a) などの変数
新しいステートメント (foo(new foobar()) など)
関数から返される参照。例:
*/
関数 foo(&$var)
{
$var++;
}
$a=5
//合法
ふー($a);
foo(新しい stdClass());
//違法使用
Function bar() // 欠落している & に注意してください
{
$a = 5;
$a を返します。
}
foo(bar()); // PHP 5.0.5 以降、致命的なエラーが発生します
foo($a = 5) // 変数ではなく式
foo(5) // 致命的なエラーが発生します
?>
test2.php |
コードは次のとおりです
コードをコピー
|
|
機能テスト(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//出力 1
test($b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリ アドレスです。関数内の $a の値を変更することで、$b の値を変更できます。変わりました
エコー「 」;
echo $b;//出力 101
/*****************************
*
* ここで、call_user_func_array の後のパラメータには & が必要であることに注意してください。
*
* ****************************/
//上記の "test($b);" では $b の前に & 記号を追加しないでください。ただし、関数 "call_user_func_array" では、パラメータを参照で渡したい場合は、次のように & 記号が必要です。次のコード:
関数 a(&$b){
}
$c=0;
Call_user_func_array('a',array(&$c));
$c をエコーします。
//出力 1
?>
参照による返却
参照リターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用されます。パフォーマンスを向上させるために戻り参照を使用しないでください。エンジンはそれ自体を最適化するのに十分な機能を備えています。正当な技術的理由がある場合にのみ参照を返してください。参照を返すには、この構文を使用します
コードは次のとおりです |
コードをコピー
関数&test()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
$b をエコーします。
$b を返します。
} |
$a=test();//このステートメントは、$b の値が 1 であることを出力します |
$a=5
$a=test();//このステートメントは、$b の値が 2 であることを出力します
$a=&test();//このステートメントは、$b の値が 3 であることを出力します。ここで、戻り値 $b の $b 変数のメモリ アドレスと $a 変数のメモリ アドレスは同じ場所を指します。
$a=5; //$b を返す変数の値が変更されました
$a=test();//このステートメントは、$b の値が 6 であることを出力します
/**
以下で説明します:
このように、$a=test(); は実際には関数からの参照を取得しません。理由としては、これは PHP の規定です。
PHP では、$a=&test(); を通じて取得されるものは関数 の参照戻りであると規定されています。
参照リターンとは何かについては (PHP マニュアルには、「参照リターンは、参照をバインドする必要がある変数を見つけるために関数を使用したい場合に使用されます。」と書かれています。) このナンセンスのせいで、私は長い間理解できませんでした
上の例で説明すると
$a=test() を使用して関数を呼び出すと、関数の値が $a に代入されるだけであり、$a への変更は関数内の $b には影響しません
$a=&test() を通じて関数を呼び出すと、その関数は $b を返す $b 変数のメモリ アドレスと、$a 変数のメモリ アドレスが同じ場所を指すようになります
つまり、これと同等の効果が生じる($a=&$b;)ので、$aの値を変更すると$bの値も変更されるので、 を実行した後、
$a=&test();
$a=5
これから、$b の価値は 5 になります
ここで静的変数を使用するのは、関数の参照戻り値を誰もが理解できるようにするためです。実際、関数の参照戻り値は主にオブジェクトで使用されます 。
*/
?>
oschina で見た興味深い例:
コードは次のとおりです
| コードをコピー
|
$a = array('アベ','ベン','カム');
foreach ($a as $k=>&$n)
$n = strtoupper($n);
foreach ($a as $k=>$n) // ここには参照がないことに注意してください
「$nn」をエコーします。
プリント_r($a);
?>
結果は次のようになります:
安倍
ベン
ベン
配列
(
[0] =>安倍
[1] =>ベン
[2] =>ベン
)
説明: 2 番目の foreach のループは次のとおりです:
配列
(
[0] =>安倍
[1] =>ベン
[2] =>安倍
)
配列
(
[0] =>安倍
[1] =>ベン
[2] =>ベン
)
配列
(
[0] =>安倍
[1] =>ベン
[2] =>ベン
)
unset($n) がないため、常に配列の最後の要素を指します。2 番目の foreach では、最初のループで $n、つまり $a[2] が ABE に変更され、2 番目のループで変更されます。 BEN を取得すると、3 回目でも BEN を取得できます。
http://www.bkjia.com/PHPjc/632667.htmlwww.bkjia.com
truehttp://www.bkjia.com/PHPjc/632667.html技術記事 PHP で参照割り当てを使用するには、元のオブジェクトの前に $b を追加するだけです。実際、PHP における参照は、同じ値を指す異なる名前を持つ 2 つの変数です。 引用とは PHP での引用とは...を使用することを意味します
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31
| |