ホームページ >見出し >PHP における参照の真の理解 - 変数参照、関数参照、オブジェクト参照

PHP における参照の真の理解 - 変数参照、関数参照、オブジェクト参照

无忌哥哥
无忌哥哥オリジナル
2018-06-27 15:49:471850ブラウズ

変数リファレンス
PHP リファレンスでは、2 つの変数を使用して同じコンテンツを指すことができます

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

関数のアドレス渡し呼び出しについては詳しく説明しません。コードは

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

ここで test(1); を使用するとエラーが発生することに注意してください。その理由は、PHP では渡される参照を定数にすることができないと規定しているためです (エラー メッセージを参照)。

関数参照の戻り まずコードを見てみましょう

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

このようにして得られるものは、実際には関数参照の戻りではなく、通常の関数呼び出しと何ら変わりません。理由: これは PHP です。 PHP では、$a=&test(); を通じて取得されるものは関数の参照戻りであると規定されています。 参照戻りとは何ですか?変数が上にある場合は、関数を使用して参照をバインドする必要があります。) このナンセンスを、私は長い間理解できませんでした。 $a=test() を使用して関数を呼び出すだけです。 $a は関数の値を $a に割り当てますが、$a は関数内の $b に何も影響しません。$a=&test() を通じて関数を呼び出すと、その関数は $b のメモリ アドレスをポイントします。変数を $b から $a 変数のメモリ アドレスに戻すと、同じ場所が生成されます ($a=&b;)。したがって、$a の値を変更すると $b の値も変更されます。 $a=&test(); を実行すると、 $b の値は 5 になります

これは、静的変数を使用する前に、関数の参照戻りを理解してもらうためです。関数は主にオブジェクトで使用されます

オブジェクト参照

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

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

参照の役割

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


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

49fec7bd36b539a617a2ddb9590602c2

は $b の設定を解除するだけです。 function quoteTest(){ global $var; //$var = &$GLOBALS['var']; と同等 unset($var); //削除は参照のみを削除しますが、参照されたコンテンツはまだ存在します。これは、変数の内容が破棄されるという意味ではありません}$var=1;quoteTest();echo $var; // 結果 1

---------- -------------------------------------------------- --------------------

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

function quoteTest(){ global $var; //$var = &$GLOBALS['var']; $var = 5 と同等; //両方とも同じメモリ内容を指すため}$var=1;quoteTest () ;echo $var //結果 5-------------------------------------- -------------------------------------------------- -- ---

'&' これは参照です

グローバル参照 グローバル $var で変数を宣言すると、実際にはグローバル変数への参照が確立されます。これは、次のことと同じです:

1494836c6ffb3c5371a1f493f42472a1

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

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

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

わかりやすく言うと 1: 次のコードがあるとします。 [php] $a="ABC"; $b=$a; [/php] 実際、この時点では $a と $b は両方とも同じメモリを指します。 $ a と $b ではなく、アドレスが別のメモリを占有します

2: 上記のコードに次のコードを追加すると、 [php] $a="EFG" [/php] $a が指すメモリ内のデータが格納されるためです。そして $b 再び書き込みます。この時点で、Zend コアは $b 用の $a のデータ コピーを自動的に決定して自動的に生成し、ストレージ用のメモリを再申請します

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