みなさん、こんにちは。インターネットで次のナレッジポイントを見ました:
関数内で宣言されたグローバル変数には、外部のメインプログラムからアクセスできます
次に、次のコードを実行して、上記の結論を検証しました。 リーリー
上記の理論に基づいて、次のコードを書きました:リーリー
テスト関数内のグローバル $var1 は外部変数 $var1 への参照であり、unset($GLOBALS['var1']); により外部 $var1 がメモリから切断されます (変数 $var1 は破棄されます)。そこで質問です
質問の冒頭の理論によると、外部の$var1が設定されていない場合でも、関数内の$var1は関数の外部からアクセスできますか? (関数内の $var1 もグローバルです!) しかし、なぜ echo $var1 は最終的にエラーを報告するのでしょうか?アドバイスをお願いします、よろしくお願いします!
さらに、別の質問がありますので、誰かが私を助けてくれることを願っています
https://segmentfault.com/q/10...
関数内で宣言されたグローバル変数には、外部のメインプログラムからアクセスできます
次に、次のコードを実行して、上記の結論を検証しました。
リーリー
リーリー
テスト関数内のグローバル $var1 は外部変数 $var1 への参照であり、unset($GLOBALS['var1']); により外部 $var1 がメモリから切断されます (変数 $var1 は破棄されます)。そこで質問です
質問の冒頭の理論によると、外部の$var1が設定されていない場合でも、関数内の$var1は関数の外部からアクセスできますか? (関数内の $var1 もグローバルです!) しかし、なぜ echo $var1 は最終的にエラーを報告するのでしょうか?アドバイスをお願いします、よろしくお願いします!
さらに、別の質問がありますので、誰かが私を助けてくれることを願っています
https://segmentfault.com/q/10...
次のように理解できます:
上段と下段の走行結果を比較できます
リーリー
global $var1;
等于$var1=&$GLOBALS['var1'];
宣言したものはグローバル変数なので関数内外で削除できます。 削除後は、関数内外を問わず存在しなくなります。
注:
関数の内部と外部の変数は同じであり、同じポインターを指します。
が言ったこと:
リーリー
が正しいです。
リーリー
この文は正しいですが、以前は & の存在に気づきませんでした。 &を外した方が分かりやすそうなので。
しかし、実際には & は存在するので、上で述べたことと同じです。$var1 の内側と外側は同じアドレスを指します。
例を振り返ってみましょう:
リーリー
-->質問: これらは同じものであるのに、なぜ一方は出力を持ち、もう一方はエラーを報告するのでしょうか?
別の方法を試してください:
$var1 = 1;function test(){
; リーリー}
test(); //99
エコー $var1;//99
-->一方を変更すると、もう一方も同時に変更されます。つまり、どちらも同じであるはずですよね?
それで、何が問題なのでしょうか?
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。
(参考:http://blog.csdn.net/ebw123/a...)暫定的な手がかりを見つけました。以下のコードを見てください: 例 1
リーリー
例 2
リーリー
例 3
1: 関数の外で $var 変数を破棄します。 $GLOBALS[ 'var'] は外側の $var 自体であるため)
2:
関数内に unset($GLOBALS['var']); の前にグローバル変数 (外部からアクセスできる) がある場合、unset($GLOBALS['var']); はグローバル変数への外部アクセスをキャンセルします。関数「right」内の変数
関数内で、unset($GLOBALS['var']); の後に既にグローバル変数 (外部からアクセス可能) がある場合、unset($GLOBALS['var']); は外部アクセスを妨げません。グローバル変数の関数「権利」に
質問:
unset($GLOBALS['var']); に加えて、外部変数 $var を破棄し、それが指す zval の refcount を 1 つ減らすことができます。
神が私に導きを与えてくださることを願っています。