PHP におけるグローバルな問題について

WBOY
リリース: 2016-10-23 00:12:54
オリジナル
1459 人が閲覧しました

みなさん、こんにちは。インターネットで次のナレッジポイントを見ました:
関数内で宣言されたグローバル変数には、外部のメインプログラムからアクセスできます

次に、次のコードを実行して、上記の結論を検証しました。 リーリー

上記の理論に基づいて、次のコードを書きました:

リーリー

テスト関数内のグローバル $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'];

私も段落を追加させてください

リーリー

宣言したものはグローバル変数なので関数内外で削除できます。 削除後は、関数内外を問わず存在しなくなります。

注:

関数の内部と外部の変数は同じであり、同じポインターを指します。

グローバル変数を宣言した後、関数内に変数、関数外に変数は作成されません。


追記:

私の理解は間違っています、階下の @Mi Mo

が言ったこと: リーリー が正しいです。

ちょっと付け加えておきます:

今まではっきりと見えていなかったことに今気づきました:

リーリー この文は正しいですが、以前は & の存在に気づきませんでした。 &を外した方が分かりやすそうなので。
しかし、実際には & は存在するので、上で述べたことと同じです。$var1 の内側と外側は同じアドレスを指します。

例を振り返ってみましょう:
リーリー
-->質問: これらは同じものであるのに、なぜ一方は出力を持ち、もう一方はエラーを報告するのでしょうか?

別の方法を試してください:

$var1 = 1;

function test(){

; リーリー

}
test(); //99
エコー $var1;//99

-->一方を変更すると、もう一方も同時に変更されます。つまり、どちらも同じであるはずですよね?

それで、何が問題なのでしょうか?

実際、問題は unset() 関数にあります。

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

(参考:http://blog.csdn.net/ebw123/a...)

暫定的な手がかりを見つけました。以下のコードを見てください:

例 1

リーリー

例 2
リーリー
例 3

リーリー

この返信の質問とコードに基づくと、要約は次のとおりです

関数内で unset($GLOBALS['var']) を使用します

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 つ減らすことができます。

    また、元々関数内にあったグローバル変数のスコープをグローバルからローカルに変更することはできますか (外部から関数内のグローバル変数にアクセスできなくなります)。

    神が私に導きを与えてくださることを願っています。

    関連ラベル:
    php
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!