- ベストアンサー
何を言いたいのでしょうか!?
- 何を言いたいのか、輪郭程度でわかる
- $GLOBALS変数を利用してグローバルスコープの変数にアクセスできる
- $GLOBALSを利用する場合は注意が必要
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
提示されている例では「違い」がわかりにくいですね。マニュアルの例の方がわかりやすいと思います。 http://www.php.net/manual/ja/reserved.variables.globals.php 変数のスコープについて調べると、もっと理解しやすいかも。 http://www.php.net/manual/ja/language.variables.scope.php 要するに変数 $a について、function内で global $a としなくても $GLOBALS['a'] で参照できるという話です。function内のローカル変数 $a と明示的に区別出来る(混在が可能になる)という利点はありますが、そもそも区別しないといけなくなるのは変数の命名がマズイというだけです。 一般的には(結論として)、$GLOBALS は使わないのが正解ですね。 必要な変数(の値)は引数で渡すべきです。書き替えることがあるなら参照渡しにすればいいだけですし、逆に参照渡しになっていれば「このfunctionで書き替える可能性がある」ことが明示出来ます。global や $GLOBALS はなるべく避けた方がいいです。そういう意味で >$GLOBALSを利用するのはやむを得ない場合や、利用用途がそのプログラムの開発に携 >わるすべての人に明確である場合に限るべきです。 ということです。
その他の回答 (3)
- Ogre7077
- ベストアンサー率65% (170/258)
昔、BASIC言語にはグローバル変数しか存在しませんでした。 そのため以下のようなバグをよくやらかしたものです。 1. 処理αにて、変数Aに値を入れた 2. 処理βにて、一時的な作業用に変数Aを使った 3. 処理αにて、変数Aに基づく処理を行い、暴走した その後 C 言語のローカル変数という存在を知り、 また構造化プログラミングを覚えたため、 この手のバグからはオサラバできました。 と思ったら、大昔の業務用ソフトの保守をすることになり、 「このグローバル変数FLAG5を勝手に変更している奴はドイツだ!」 と笑えない冗談をかましながらチーム一丸となって 犯人探しに躍起になったことがあります。 その時は確か 怪しいCOBOLソースをラインプリンタで全部印刷して(ここまでで半日) 手分けして一行一行さがして(ここまでで二日) 候補をもちよって検討して(四日) 結局謎のままうやむやになった(五日) 悪いことは言いません。 プログラムの用途や規模に関係なく、グローバル変数は更新しちゃいけません。 もし万が一にも更新する必要があるならば、ソース内のコメントに ・処理の必要性を訴える理由 ・この決定にいたる詳細な経緯、できれば議事録をそのまま ・決定者の氏名と本人への確実な連絡手段 を記載する位の覚悟でお願いします。
補足
ご回答誠にありがとうございます。 読ませていただきました。 大変貴重な体験談だと受け止めました。 かなり、勉強と参考になります。 今回は4件ものご回答を得て、多いので 解決にはもうしばらくお待ちくださいませ^^
$GLOBALS にはグローバルスコープ(一番外側の領域)にある変数を自動的にPHPが参照代入を行っています。例えば $test という変数をグローバルスコープに作ると $GLOBALS['test'] = &$test; という操作が自動的に行われているということです。これは $GLOBALS['test'] と $test が「全く同じもの」であるという意味です。たまたまそれぞれの場所に格納された値が同じという意味ではなく、値が格納されている場所自体が同じである、という意味であることに注意してください。(但し、$GLOBALSの要素にはvar_dumpで参照を意味する「&」を表示しないという特例が適用されています) グローバル変数に関数内からアクセスするときには global $test; のようにグローバル宣言が通常は必要ですが、先ほどの $GLOBALS['test'] という別名を使えばグローバル宣言をせずともその変数にアクセス出来ます。主にそのために存在する機能です。しかし、そもそもグローバル変数自体グローバルスコープ以外からアクセスするのは避けたほうが無難です。汚いコードを書くことに直結します。 結論: 「グローバル宣言とか$GLOBALSとかあったなぁ」ぐらいに認識しておいて別に忘れても構わない 関連: NULLと未定義の違い http://qiita.com/mpyw/items/0a4ea0bc9a695da33f0c
- hitomura
- ベストアンサー率48% (325/664)
他言語の人間ですが、内容を読むと、書かれた意味を「正確に」理解できない状態で使うと問題を生む機能のようです。 大半の場合、以下の内容で十分でしょう。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $GLOBALS 使うな。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
お礼
ご回答誠にありがとうございました。 http://www.php.net/manual/ja/language.variables.scope.php の中間あたりから、まだまだ、私の知識の範囲を超えた内容で、理解できません。 早く理解できるように、がんばります~~
補足
分かりやすい、ULRのご紹介いただき、誠にありがとうございます。 暇ひま、読ませていただいたています。 解決には、しばらくお待ちくださいませ。