ホームページ  >  記事  >  バックエンド開発  >  PHP における & 記号の役割 - 変数参照、関数参照、オブジェクト参照

PHP における & 記号の役割 - 変数参照、関数参照、オブジェクト参照

巴扎黑
巴扎黑オリジナル
2017-08-05 10:22:331713ブラウズ

(PHPのリファレンス(変数や関数、オブジェクトなどの前に&記号を付けること) // 一番重要なのは参照変数を削除することですが、参照変数にはアクセスできませんが、内容は削除されませんPHP で同じ名前の変数コンテンツにアクセスします。

変数の引用

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

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

関数の直下にコードが示されています。

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

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

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

<?phpfunction &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(); は実際には関数参照 return ではなく、通常の関数と何ら変わりません。理由としては、これは PHP の規定であり、$a=&test(); で得られるものは関数の参照戻り値であると規定されています (PHP のマニュアルには次のように書かれています)。参照リターンは、変数にバインドされている関数を使用して参照を見つけたいときに使用されます。) このナンセンスのために、$ を使用して関数を呼び出すことを上記の例を使用して説明するのに、長い間理解できませんでした。 a=test() は関数の値を $a に割り当てるだけであり、 $a を変更しても関数内の $b には影響しません

そして $a=&test() を通じて関数を呼び出すとき、その関数は次のようになります。 $b 変数を


に返すには、メモリ アドレスと $a 変数のメモリ アドレスは同じ場所を指しているため、同じ効果が得られます ($a=&b;)。したがって、$a

の値も変更します。同時に$bの値も変更するので、 $ a=&test(); を実行すると、$bの値は5になりますこれは関数の参照戻りを理解してもらうためです実際、関数の参照戻りは主にオブジェクトで使用されます オブジェクト参照

<?phpclass 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 では、メモリ容量を節約できるため、配列の転送には「&」メソッドを使用することをお勧めします。

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

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

これは、たとえば、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 のデータコピーを決定して自動的に生成し、ストレージ用のメモリを再申請します

以上がPHP における & 記号の役割 - 変数参照、関数参照、オブジェクト参照の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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