ホームページ > バックエンド開発 > PHPチュートリアル > PHP のグローバル変数がローカル変数のアドレスを参照している場合

PHP のグローバル変数がローカル変数のアドレスを参照している場合

WBOY
リリース: 2016-06-23 13:34:31
オリジナル
890 人が閲覧しました

	$b = "dasdf";	function abc(){		$a = "abc";		global $b;		$b = &$a;		echo $b."inner;";	}	abc();	echo $b.";";
ログイン後にコピー


関数内で b を出力すると abc になるのですが、関数を抜けた後は b が出力されて dasdf の初期値に戻ってしまいます どうなっているでしょうか?ローカル変数のアドレスが参照されるため、ローカル変数が破棄された後は b の値が空になるのは当然です。


ディスカッションへの返信 (解決策)

マニュアル内:
http://www.php.net/manual/zh/ language.references.whatdo.php#example-251
A 変数を指定した場合グローバルに宣言された関数には、関数内でのみ表示される参照が割り当てられます。これは、$GLOBALS 配列を使用することで回避できます。
理由は次のとおりです:
global $var; を $var =& $GLOBALS['var']; の省略形として扱います。したがって、他の参照を $var に代入しても、ローカル変数の参照が変更されるだけです。

$b = "dasdf";
function abc(){
$a = "abc";
global $b; //これは $GLOBALS['b'] への参照です
$b = &$a;
$GLOBALS['bb'] = & $a;
echo $b.";";
echo $b.";"; bb; //abc


理解してください、関数内の $b は実際にはまったくグローバル $b ではなく、ローカル変数であることに変わりはありませんが、文 global $b はこの変数を宣言するだけでなく、それを指すこともあります。したがって、その値を変更 (再割り当て) すると、グローバル変数は上書きされます。ただし、文 $b = &$a は、ローカル変数 $b を $a が指すオブジェクトを指します。グローバル オブジェクト

PHP の 2 つの概念を思い出してください。すべての変数はポインターであり、異なるスコープを持つすべての変数は異なる変数です。つまり、

PHP の 2 つの概念を思い出してください。すべての変数はポインターであり、すべての変数はスコープが異なれば変数も異なります。つまり

前者は JavaScript にも当てはまりますが、後者は JavaScript では異なります


ただし、JavaScript には本質的に新しいオブジェクトを作成するか、または新しいオブジェクトを作成するだけです。オブジェクトを破棄したり、変数が指すオブジェクトを変更したりすることはありません。ただし、PHP は C++ に似ており、JavaScript は純粋なオブジェクト指向に似ています。変数のメモリが取り消されると、その変数を参照しているメモリも取り消されますか?この場合、記述内容は次のように理解できます。関数の実行が終了したため、ローカル変数は自動的に解放されます。その後、参照変数もそれに応じて解放されます。変数を外部で使用する場合、変数を再割り当てしますか?
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート