ホームページ  >  記事  >  バックエンド開発  >  PHPリファレンス&シンボルの詳しい説明

PHPリファレンス&シンボルの詳しい説明

巴扎黑
巴扎黑オリジナル
2016-11-24 10:53:051123ブラウズ

PHP リファレンス (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加します)

PHP におけるリファレンスとは、異なる名前が同じ変数の内容にアクセスすることを意味します。

変数リファレンス

PHP リファレンス を可能にします。 2 つの変数を使用して同じコンテンツを指すようにするには

例 1:

$a="2010";

$b =&$a;

echo $a;//ここに出力します: 2010

echo $b;//ここに出力: 2010

$b="2012";

echo $a;//ここでの $a の値は 2012 に変更されるため、出力は

echo $b;//ここでは 2012 を出力します

?>

例 2:

$a = "date";

$b = &$a;

echo $a; // date

echo $ b ; // date

$b = "date1";

echo $a; // date1

unset($a);

echo $b;

?>

上記 2 つの例から、$b のメモリ アドレスを $b に与えるのは単純な代入ではないことがわかります。したがって、$b

に対する操作は$aにも影響します

別の言い方は、$aにエイリアス$bを追加することです。$aが削除されると、変数の名前だけが削除されますが、変数は削除されます。この変数の内容は、エイリアスを使用して引き続き表示できます。 (図に示すように)

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

例 3:

function test(&$a)

{

$a=$a+100;

}

$b=1;

echo $b;//出力1

//$bが関数に渡すのは、実際には$bの値を変更することにより、$bの変数内容が配置されているメモリアドレスです。関数内の a $b

test($b);

echo $b;//出力 101

?>

ここで test(1); とするとエラーになります。

説明 パラメータは変数のみにすることができ、定数にはアドレスを渡すことができません。

関数参照 return

関数参照 return は主にオブジェクトで使用されます。わかりやすいように静的変数を使用する例を示します。

例 4:

function &test()

{

static $b=0;//静的変数を宣言します

$b=$b+1;

echo $b;

return $b;

}

// このステートメントは $ の値を出力しますb は 1

$a=test();

$a=5;

$a=test();//このステートメントは $b の値を 2

として出力します

$a=&test( ) ;//このステートメントは $b の値を 3 として出力します

$a=5;

$a=test();//このステートメントは $b の値を 6 として出力します

コメント、この関数is 出力があり、戻り値もあります。

$a = test(); これは関数 test の戻り値 $b を $a に代入するだけであり、関数からの参照戻りではありません。したがって、$a がどのような操作を行っても、$b には影響しません。

$a = &test(); この関数は、$b のメモリ アドレスと $a のメモリ アドレスを同じ場所にポイントすることで、$b = &$a の値と同様の効果が得られます。 $aが変化し、5になっても$bの値にも影響します。 $a = &test(); $a = 5 を実行すると、$b = 5 があり、関数の処理後に $b = 6 が出力されます

オブジェクトの参照5:

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 を出力

?> ;

上記のコードは、PHP5 で実行した結果です。PHP5 では、オブジェクトのコピーは参照を通じて行われます。

$b=new a; $c=$b; 上の列は、実際には $b=new a; $c=&$b; と同等です

PHP5 のデフォルトでは、オブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望む場合があります。このような目的のために、PHP では __clone と呼ばれる特別なメソッドが定義されています。

参照の役割

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

さらに、php5で大きな配列を転送する場合は、メモリスペースを節約できるため、「&」メソッドを使用することをお勧めします。

参照解除

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

例:

$a = 1;

$b =& $a;

unset ($a);

?>

は$bの設定を解除しません。 。

変数参照セクションを参照してください

グローバル参照

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

これは次のコードと同等です:

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

?>

これは、たとえば、unset $var は unset されないことを意味します。グローバル変数。

$this

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

追加手順

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

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

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

追記: $a と $b が指すように $b = &$a にするべきだと個人的には思います。同じメモリアドレスですが、これは私が参照した情報の内容です。現時点では、私は & についてあまり知りません。もし他の意見がある場合は、ありがとうございます

。 $a と $b が異なるメモリを占有するのではなく、両方とも同じメモリ アドレスを指します

上記のコードに追加すると、次のコードになります

$a="EFG";

"操作

$a と $b が指すメモリ内のデータを書き換える必要があるため、この時点で Zend コアが自動的に判断し、$a の $b 用のデータ コピーを自動的に生成し、再書き込みします。ストレージ用のメモリを申請します。


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