PHPからの抜粋

WBOY
リリース: 2016-06-13 13:26:11
オリジナル
855 人が閲覧しました

PHP リファレンス

??? PHP におけるいわゆる参照とは、異なる名前が同じ変数の内容にアクセスすることを意味します。変数、関数、オブジェクトの前にアンパサンドを追加することで、それらの変数、関数、オブジェクトに対して使用できます。参照の種類と機能について詳しく説明します:

?

1. 参照型

1.1. 変数参照: 2 つの変数は同じコンテンツを指します

<?php
  $a = "abc"; 
  $b = &$a; 
  echo $a;//这里输出:abc 
  echo $b;//这里输出:abc 
  
  $b = "done"; 
  echo $a;//这里$a的值变为done, 所以输出done 
  echo $b;//这里输出done
?> 
ログイン後にコピー


1.2. 関数の参照渡し

function test(&$a)
{
	$a=$a+100; 
}

$b=1;

test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值,就可以改变$b的值了 

echo $b;//输出101 
ログイン後にコピー
?

ここで test(1); を使用するとエラーが発生するので注意してください

1.3.

?
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 
ログイン後にコピー
説明は次のとおりです。

???? $a=test() を使用して関数を呼び出すと、関数の値が $a に代入されるだけであり、$a に対する変更は関数内の $b に影響しません。一方、$a=&test() を呼び出すと、関数の場合、その機能は $b を返す $b 変数のメモリ アドレスと、$a 変数のメモリ アドレスを同じ場所にポイントすることです。これにより、この効果 ($a=&b;) と同等の効果が得られます。 $a の値は $b の値も変更するため、
を実行した後

$a=&test();
$a=5;

これから $b の値は 5 になります

ここでは、関数参照の戻り値を理解しやすくするために静的変数が使用されています。実際、関数参照の戻り値は主にオブジェクト
で使用されます。

?

1.4. オブジェクト参照

?
class testa
{
	var $abc="ABC"; 
}

$b=new testa;
$c = &$b; // or $c = $b;
echo $b->abc;//这里输出ABC 
echo $c->abc;//这里输出ABC 
$b->abc="DEF"; 
echo $c->abc;//这里输出DEF 
ログイン後にコピー
上記のコードは PHP5 で実行した結果です

PHP5 では、オブジェクトのコピーは参照によって実現されます。上記の例では、$b=new a; $c=$b; は $c=&$b; と同等です。 PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを期待したい場合もあります。 この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義します。



2. 参照の役割

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




3. 引用符を外します

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


?? $a = 1; ?? $b =& $a; ?? 設定を解除します ($a)
?>

$b の設定は解除されず、$a が破棄されるだけです。

もう 1 つの例は、グローバル $var で変数を宣言する場合、グローバル変数への参照が実際に確立されることです。これは、

を実行するのと同じです。 ??? $var =& $GLOBALS["var"]; ?>

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

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

?

追記:

PHP の利点の 1 つは、自動ガベージ コレクション メカニズム (メモリの解放) を活用できることです。つまり、変数を使用した後にメモリを解放するための処理を行う必要はなく、PHP が自動的に実行します。もちろん、必要に応じて unset() 関数を呼び出してメモリを解放することもできますが、通常はこれを行う必要はありません。

ただし、PHP では、次のようなメモリが自動的に解放されない状況が少なくとも 1 つあります:


2 つのオブジェクト間に「親オブジェクト-子オブジェクト」などの相互参照関係がある場合、親オブジェクトで unset() を呼び出しても、(親オブジェクトがガベージであっても) 子オブジェクトで親オブジェクトを参照しているメモリは解放されません。収集された場合はリリースされません)。



このとき、手動で unset() を呼び出しても同様です。詳細については、http://bugs.php.net/bug.php?id=33595 を参照してください。 。

妥協点は unset() 関数のオブジェクトの __destruct() メソッドを呼び出すことです。

?

?

----------------------------------------------- --- - 補足:


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

平たく言うと
1: 以下のコードがある場合

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

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

2: 上記のコードに次のコードを追加すると

$a="EFG";

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート