ホームページ  >  記事  >  バックエンド開発  >  PHPにおける参照記号(&)の使い方を詳しく解説

PHPにおける参照記号(&)の使い方を詳しく解説

墨辰丷
墨辰丷オリジナル
2018-05-29 17:35:381599ブラウズ

PHP での参照は、変数、関数、オブジェクトなどの前に & 記号を追加することです。PHP での参照は、異なる名前が同じ変数の内容にアクセスすることを意味します。PHP での参照の使用方法を説明します。参照することができます

C言語のポインタとは異なります。言語のポインタは、変数の内容がメモリに格納されているアドレス変数への参照を格納します。

PHP の参照では、2 つの変数を使用して同じ内容を指すことができます

$a="ABC"; 
$b =&$a; 
echo $a;//这里输出:ABC 
echo $b;//这里输出:ABC 
$b="EFG"; 
echo $a;//这里$a的值变为EFG 所以输出EFG 
echo $b;//这里输出EFG

アドレスによる関数呼び出し。

アドレスによる呼び出しについては詳しく説明しません。コードはすぐ下にあります。

ここで test(1); を使用するとエラーが発生することに注意してください。理由は自分で考えてください

関数のリファレンスリターン

まずコードを見てください

<?php
function test(&$a) {
  $a = $a + 100;
}
$b = 1;
echo $b; //输出1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b; //输出101

?>

以下の説明:


このように、$a=test(); は実際には関数の参照戻りは通常の関数呼び出しと変わりません。これは PHP の規則であり、関数の参照戻りは $a=&test(); によって取得されると規定されています。参照リターン?(PHPマニュアルには、参照リターンは関数を使用して参照を見つけたい場合に使用されます。それが変数にバインドされている場合に使用する必要があります。)このナンセンスのために、私は長い間それを理解できませんでした。


上記の例を使って説明すると、

$a=test() を使用して関数を呼び出すことになります。これは、関数の値を単に $a に割り当てるだけであり、$a への変更は $ には影響しません$a=&test() を通じて関数を呼び出すと、その関数は $b を返す変数のメモリ アドレスと、$a 変数のメモリ アドレスが同じ場所を指すことを比較します。同等の効果が得られます ($a=&b;)。つまり、$a の値を変更すると、$b の値も変更されるため、


$ a=&test(); を実行した後、

その後、$b の値は 5 になります

これは、静的変数を使用する前に関数の参照戻り値を理解してもらうためです。実際、関数の参照戻り値はオブジェクト内で多くの用途があります
Reference。オブジェクトの


<?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

?>


上記のコードは、PHP5 での実行効果です

PHP5 では、オブジェクトのコピーは参照を通じて行われます。上記の列の $b=new a; $c=$b; は、実際には $b=new a; $c=&$b; と同等ですが、場合によってはオブジェクトを参照します。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望みます。この目的のために、PHP は __clone という特別なメソッドを定義します

。プログラムは比較的大きいため、同じオブジェクトを参照する変数が多数あり、オブジェクトを使用した後に手動でクリアしたい場合は、「&」メソッドを使用し、その後 $var=null を使用してクリアすることを個人的にお勧めします。それ以外の場合は、php5 のデフォルトのメソッドを使用してください。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。


参照解除



参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。例:

<?php
class a {
  var $abc = "ABC";
}
$b = new a;
$c = $b;
echo $b->abc; //这里输出ABC
echo $c->abc; //这里输出ABC
$b->abc = "DEF";
echo $c->abc; //这里输出DEF

?>

は$bの設定を解除せず、$aのみを設定解除します。


グローバル参照

グローバル $var で変数を宣言すると、実際にはグローバル変数への参照が作成されます。これは、

$a = 1; 
$b =& $a; 
unset ($a);

を実行するのと同じです。これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。


$this

オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照です。

//ここでまたちょっとしたエピソードです

​​

phpのアドレスのポインティング(ポインタに似た)機能はユーザー自身が実装するのではなく、Zendコアによって実装されます。phpの参照は「copy-on」を使用します。 -write" 原則として、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。


簡単に言うと

1: 次のコードがあるとします

$var =& $GLOBALS["var"];

実際、この時点では、$a と $b は両方とも同じメモリ アドレスを指しており、$a と $b が占有しているのではありません。さまざまな思い出2 :上記のコードに次のコードを追加すると

$a="ABC"; 
$b=$a;

以上がこの記事の全内容となりますので、皆様の学習のお役に立てれば幸いです。

関連する推奨事項:

PHP

名前空間に参加するメリットは自動読み込みに便利

PHP

エラーレベル設定と原理分析

phpプロセス制御ブレークステートメント
php フロー制御 continue ステートメント


以上がPHPにおける参照記号(&)の使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。