ホームページ  >  記事  >  バックエンド開発  >  PHP 変数のスコープ、リファレンス、オブジェクトリファレンス、transfer_PHP チュートリアル

PHP 変数のスコープ、リファレンス、オブジェクトリファレンス、transfer_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:14:111103ブラウズ

この記事ではPHPの変数スコープ、参照、オブジェクト参照、転送について紹介していますので、困っている方は参考にしてください。

変数スコープ
変数のスコープは、変数が定義されているコンテキスト (つまり、その有効スコープ) です。ほとんどの PHP 変数にはスコープが 1 つだけあります。この単一スコープ スパンには、include および require によって導入されたファイルも含まれます。例:

コードは次のとおりです コードをコピー
$a = 1;
「b.inc」を含める;
?>

この変数 $a は、インクルードされたファイル b.inc で有効になります。ただし、ユーザー定義関数では、ローカル関数スコープが導入されます。関数内で使用される変数は、デフォルトではローカル関数のスコープに制限されます。例:

コードは次のとおりです コードをコピー

$a = 1; /* グローバルスコープ */

関数テスト()
{
echo $a; /* ローカルスコープ変数への参照 */
}

テスト();
?>

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()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
エコー $b;
$b を返します;
}
$a=test();//このステートメントは、$b の値が 1 であることを出力します
echo "
";
$a=5;
$a=test();//このステートメントは、$b の値が 2 であることを出力します
echo "
";
$a=&test();//このステートメントは、$b の値が 3 であることを出力します
echo "
";
$a=5;
$a=test();//このステートメントは、$b の値が 6 であることを出力します
?>

以下の説明:
このように、 $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{
パブリック $abc="ABC";
}
$b=新しい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=&$b; と同等です。 PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義しています。
例えば以下の例

コードは次のとおりですコードをコピー

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

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

クラス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 によって渡された変数を受け取ります!

moviesite.php

コードは次のとおりです

コードをコピー

<頭> //$myfavmovie=urlencode("ブライアンの生涯");
お気に入りの映画を見つけてください
echo ""; echo "私のお気に入りの映画について詳しく見るには、ここをクリックしてください!";

エコー ""; ?>









www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629033.html技術記事この記事では、PHP の変数スコープ、参照、オブジェクト参照、転送について紹介します。必要な方は参考にしてください。 変数のスコープ 変数のスコープは、変数が定義されているコンテキスト (つまり...
)

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