ホームページ  >  記事  >  バックエンド開発  >  PHP 変数のスコープとアドレス参照の問題の分析

PHP 変数のスコープとアドレス参照の問題の分析

WBOY
WBOYオリジナル
2016-07-25 08:55:091019ブラウズ
  1. function test()
  2. {
  3. static $b=0;//静的変数を関数の外で宣言した場合、関数内では使用されません
  4. $b=$b+1;
  5. echo $ b;
  6. }
  7. test();//このステートメントは $b の値を 1 として出力します
  8. test();//このステートメントは $b の値を 2 として出力します
コードをコピーします

注: static $b=0 この代入操作は、変数が初めて初期化されるときにのみ実行されます。 付録 A: クラス内の静的メンバーと静的メソッドは、ほとんどの場合、呼び出し時にクラス名または self または親に :xxx を加えたものを使用しますが、その宣言はメソッドの外にあります。 付録 B: js のスコープは次のとおりです: use var aa=‘xxx’; 関数の外で宣言されるものはグローバル変数です (修飾子 var の有無に関係なく)。ローカル変数は関数内で var を使用して宣言され、グローバル変数は var を使用せずに宣言されます。 付録 C: PHP リファレンスについて PHP リファレンス: 変数、関数、またはオブジェクトの前に &. リファレンスを追加すると、同じ変数の内容に別の名前でアクセスできます。

1. 変数の参照:

  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が出力される
コードをコピー

2.機能の

  1. function test(&$a)
  2. {
  3. $a=$a+100;
  4. } // bbs.it-home.org
  5. $b=1;
  6. echo $b ;//出力 1
  7. test($b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリ アドレスであり、値を変更することで $b の値を変更できます。関数内の $a の
  8. echo "
    ";
  9. echo $b;//出力 101
コードをコピーします

3.

  1. function &test()
  2. {
  3. static $b=0;//静的変数を宣言
  4. $b=$b+1;
  5. echo $b;
  6. return $b;
  7. }
  8. $a=test();//このステートメントは $b の値を 1 として出力します
  9. $a=5;
  10. $a=test();//このステートメントは $b の値を 2 として出力します
  11. $a=&test();//このステートメントは $b の値を 3 として出力します
  12. $a=5;
  13. $a=test();//このステートメントは $b の値を 6 として出力します
コードをコピー

分析: $a=test() を使用して取得するものは、実際には関数から返される参照ではありません。 $b には影響せずに、関数の戻り値を $a にコピーするだけです。この通話は通常の通話と変わりません。 Php では、 $a=&test() メソッドは関数の参照を返すと規定されています。彼は、$b 変数のメモリ アドレスと $a 変数のメモリ アドレスが同じ場所を指しました。これは $a=&$b;

と同等です

4. 参照をキャンセルする

  1. $a = 1;
  2. $b =& $a;
  3. unset ($a);
  4. echo $b;
コードをコピー

分析: 参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけで、内容が破棄され、その値がまだ存在するという意味ではありません。

5. グローバルな引用: global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。

  1. Global $val <=> $var=&$GLOBALS['var'] ;
コードをコピー
6. オブジェクトのメソッドでは、$this によって呼び出されるオブジェクトが、それを呼び出す参照になります。 注: PHP でのアドレスの指定はユーザー自身によって実装されるのではなく、Zend コアを通じて PHP 参照は「書き込みコピー」の原則を採用します。つまり、書き込み操作が発生しない限り、変数は同じアドレスまたは同じアドレスを指します。オブジェクトはコピーされません。 例:

$a = 1; $b =$a;

$a と $b はどちらも同じメモリ アドレスを指します。$a と $b が異なるメモリを占有するわけではありません。 ここで $a="dsd" という文を実行すると、$a と $b が指すメモリ データを書き換える必要があると、この時点で zend コアが自動的に判断します。 $b 用の $a のデータ コピーを自動的に生成し、ストレージ用のメモリを再適用します。

PHP 変数スコープと PHP リファレンスについては以上です。皆さんのお役に立てれば幸いです。


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