この記事ではPHPの変数スコープ、参照、オブジェクト参照、転送について紹介していますので、困っている方は参考にしてください。
変数スコープ
変数のスコープは、変数が定義されているコンテキスト (つまり、その有効スコープ) です。ほとんどの PHP 変数にはスコープが 1 つだけあります。この単一スコープ スパンには、include および require によって導入されたファイルも含まれます。例:
コードは次のとおりです | コードをコピー |
$a = 1; 「b.inc」を含める; ?> |
この変数 $a は、インクルードされたファイル b.inc で有効になります。ただし、ユーザー定義関数では、ローカル関数スコープが導入されます。関数内で使用される変数は、デフォルトではローカル関数のスコープに制限されます。例:
コードは次のとおりです | コードをコピー |
$a = 1; /* グローバルスコープ */ 関数テスト() テスト(); |
echo ステートメントは変数 $a のローカル バージョンを参照しており、このスコープ内の値が割り当てられていないため、このスクリプトからの出力はありません。 PHP のグローバル変数は C 言語とは少し異なることに気づくかもしれません。C 言語では、ローカル変数によってオーバーライドされない限り、グローバル変数は関数内で自動的に有効になります。これにより問題が発生する可能性があり、誰かが誤ってグローバル変数を変更してしまう可能性があります。 PHP のグローバル変数を関数で使用する場合は、グローバル変数を宣言する必要があります。
PHP での引用とは、異なる名前が同じ変数の内容にアクセスすることを意味します。
C言語のポインタとは異なります。 C言語のポインタは変数の内容がメモリ上に格納されるアドレスを格納します
変数参照
コードは次のとおりです | コードをコピー |
$a="ABC"; $b =&$a; echo $a;echo "rn";//ここに出力: ABC echo $b;echo "rn";//ここに出力: ABC $b="EFG"; echo $a;echo "rn";//ここでの$aの値がEFGになるのでEFGが出力されます echo $b;echo "rn";//ここにEFGを出力します ?> |
関数のアドレスで呼び出す
アドレスによる呼び出しについては詳しく説明しません。コードはすぐ下にあります
コードは次のとおりです | コードをコピー |
機能テスト(&$a) { $a=$a+100; } $b=1; echo $b;//出力 1 echo " "; test($b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリ アドレスです。関数内の $a の値を変更することで、$b の値を変更できます。変わりました echo " "; echo $b;//出力 101 ?> |
ここでtest(1);を使用するとエラーが発生するので注意してください
関数参照が返されます
まずはコードを見てみましょう
コードは次のとおりです | コードをコピー |
関数&test() |
以下の説明:
このように、 $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になります
ここで静的変数を使用するのは、関数の参照戻り値を誰もが理解できるようにするためです。実際、関数の参照戻り値は主にオブジェクトで使用されます
。
オブジェクトリファレンス
コードは次のとおりです | コードをコピー |
クラスA{ |
上記のコードはPHP5での実行エフェクトです
PHP5 では、オブジェクトのコピーは参照を通じて行われます。上の列では、 $b=new a; $c=$b; は $b=&$b; と同等です。
PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義しています。
例えば以下の例
コードをコピー | |
クラスA{ パブリック $abc="ABC"; } $b=新しいa; $c=$b; $d = クローン$b; echo $b->abc;//ここにABCを出力します echo $c->abc;//ここにABCを出力します $b->abc="DEF"; echo $c->abc;//ここにDEFを出力します echo $b->abc;//ここにDEFを出力します $d->abc="111"; echo $d->abc;//ここでの出力は 111 です echo $b->abc;//DEF がここに出力され、クローン作成後の $d オブジェクトへの変更が $b オブジェクトに影響しないことを示します ?> |
コードは次のとおりです | コードをコピー |
$a = 1; $b = &$a; 設定を解除 ($a); var_dump($a);//ここではnullが出力されます var_dump($b);//Int 1 がここに出力されます ?> |
$b の設定は解除されず、$a のみが解除されます。
グローバルな引用
global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それはこれを行うのと同じです:
$var =& $GLOBALS["var"];
?>
これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。
$これ
オブジェクト メソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。
//もう一つ小さなエピソードをご紹介します
PHP のアドレス ポインティング (ポインタに似た) 関数は、ユーザー自身によって実装されるのではなく、Zend コアによって実装されます。PHP の参照は、書き込みが行われない限り、コピーオンライトの原則を採用しています。操作が発生すると、それは同じアドレスを指します。その変数またはオブジェクトは
です。
コピーされません。
平たく言えば
1: 次のコードがある場合
$a="ABC";
$b=$a;
実際、この時点では、$a と $b が異なるメモリを占有するのではなく、両方とも同じメモリ アドレスを指します
2:上記のコードに以下のコードを追加すると
$a="ABC";
$b=$a;
$a="EFG";
$a と $b が指すメモリ内のデータは書き換える必要があるため、Zend コアはこの時点で自動的に判断し、$b 用の $a のデータ コピーを自動的に作成し、$b 用のメモリを再申請します。ストレージ
PHPでの変数の受け渡しを学びましょう!
1 URLを使用して変数を渡します
例
コードは次のとおりです | コードをコピー |
echo "私のお気に入りの映画サイトは :"; エコー $_GET['お気に入り'] ; エコー ""; $映画化= 5 ; エコー「この映画の私のお気に入りの映画評価は 」 エコー $映画化 ?> 本文> このファイルをmovie1.php.という名前で保存します $_GET['favmovie'] を使用して、URL によって渡された変数を受け取ります! | 別のファイルに書き込んで名前を付けて保存
コードは次のとおりです
コードをコピー
エコー "
//$myfavmovie=urlencode("ブライアンの生涯");
<頭>
echo "";
echo "私のお気に入りの映画について詳しく見るには、ここをクリックしてください!";
)