ホームページ >バックエンド開発 >PHPチュートリアル >値渡しによるphpリファレンスの詳細な紹介

値渡しによるphpリファレンスの詳細な紹介

WBOY
WBOYオリジナル
2016-07-25 09:00:031203ブラウズ
  1. $a="ABC";
  2. $b =&$a;
  3. echo $a;//ここに出力: ABC
  4. echo $b;//ここに出力: ABC
  5. $b= "EFG";
  6. echo $a;//ここの$aの値がEFGになるのでEFGが出力される
  7. echo $b;//ここにEFGが出力される
  8. ?>
コードをコピー

2.関数転送のアドレス

  1. function test(&$a)
  2. {
  3. $a=$a+100;
  4. }
  5. $b=1;
  6. echo $b;//output 1
  7. test($ b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリアドレスです。関数内で $a の値を変更することで、$b の値を変更できます
  8. echo "
    " ;
  9. echo $b;//出力 101
ここで test(1) を実行するとエラーが発生することに注意してください
3. 関数参照の戻り値

    function &test()

  1. {
  2. static $b=0;//静的変数を宣言
  3. $b=$b+1;
  4. echo $b;
  5. return $b;
  6. }

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

  8. $a=5;
  9. $a=test(); として出力します。 //このステートメントは $b の値を 2

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

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

  14. コードをコピー
説明: このように、 $a=test(); は実際には関数からの参照を取得しません。理由としては、これは PHP の規定です。 PHP では、$a=&test(); を通じて取得されるものは関数の参照戻り値であると規定されています。 参照リターンとは何かというと(PHPマニュアルには、参照リターンは、参照をバインドする必要がある変数を見つけるために関数を使用したい場合に使用されます。)このナンセンスなため、私は長い間理解できませんでした
上記の例を使って説明します $a=test() を使用して関数を呼び出すと、関数の値が $a に代入されるだけであり、$a を変更しても関数内の $b には影響しません。 $a=&test() を介して関数を呼び出すと、その関数は $b を返す $b 変数のメモリ アドレスと、$a 変数のメモリ アドレスを同じ場所にポイントします。 つまりこれと同等の効果が得られる($a=&b;)ので、$aの値を変更すると$bの値も変更されるので、実行後 $a=&test(); $a=5; これから$bの価値は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; と同等です。 PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義しています。
    4. 引用の役割 プログラムが比較的大きく、同じオブジェクトを参照する変数が多数あり、オブジェクトを使用した後に手動でクリアしたい場合は、個人的には「&」メソッドを使用し、それ以外の場合は $var=null を使用してクリアすることをお勧めします。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。

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

    $a = 1;
  • $b =& $a;
  • unset ($a);
  • ?>
  • コードをコピー
  • は$bの設定を解除しません。 $a。
    6. グローバルリファレンス global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それは以下を行うのと同じです:

    $var =& $GLOBALS["var"];
  • ?>
  • コードをコピー
  • これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。 $this オブジェクト メソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。 //以下にもう一つの短い間奏曲 PHP のアドレス ポインティング (ポインタに似た) 関数は、ユーザー自身によって実装されるのではなく、PHP の参照は、書き込み操作が発生しない限り、「書き込み時コピー」の原則を採用します。 、同じアドレスを指す変数またはオブジェクトはコピーされません。

    平たく言うと 1: 以下のコードがある場合 $a="ABC"; $b=$a; 実際、この時点では、$a と $b が異なるメモリを占有するのではなく、両方とも同じメモリ アドレスを指します

    2: 上記のコードに以下のコードを追加すると $a="EFG";

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

    あなたが興味を持ちそうな記事: 値渡しによるphpリファレンスの例を詳しく解説 phpで引用したサンプルコード phpで引用した例を詳しく解説 PHPリファレンスについての説明 PHPの参照(&)記号の詳しい説明 PHP変数参照、関数アドレス、オブジェクト参照の分析例 例を通して、PHP での値渡しと参照渡しの違いを理解します 例を通してPHPアドレス参照の効率の問題を見てみましょう PHP参照アドレスの変数値の変更に関する問題 PHPの引用、「&」の説明



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