何を言いたいのでしょうか!?

このQ&Aのポイント
  • 何を言いたいのか、輪郭程度でわかる
  • $GLOBALS変数を利用してグローバルスコープの変数にアクセスできる
  • $GLOBALSを利用する場合は注意が必要
回答を見る
  • ベストアンサー

何を言いたいのでしょうか!?

 以下の意味ですが、わたし的(素人)には何を言いたいのか、物に例えると、輪郭程度でしたらわかります。  具体的に何を言いたいのでしょうか!?(PHP教本にありました。)   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $GLOBALS グローバルスコープに定義された変数名をキーとして連想配列を持ちます。 <?php $globals_test = 1; echo $globals_test,PHP_EOL; (1) echo $GLOBALS[‘globals_test’],PHP_EOL; (2)  (1)と(2)は同じ変数を参照にしており、このスクリプトでは1が出力されます。 PHPでは関数の中などのローカルスコープでも、$GLOBALS変数を用いてあらゆるグローバル 変数への読み書きができます。globalキーワードと同様、スコープを区切らずにあらゆる変数にア クセスできてしまうと、思わぬ個所で値が変更され、それが他の個所で思わぬ影響を及ぼす場合があ ります。$GLOBALSを利用するのはやむを得ない場合や、利用用途がそのプログラムの開発に携 わるすべての人に明確である場合に限るべきです。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  以上よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

提示されている例では「違い」がわかりにくいですね。マニュアルの例の方がわかりやすいと思います。 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を利用するのはやむを得ない場合や、利用用途がそのプログラムの開発に携 >わるすべての人に明確である場合に限るべきです。 ということです。

nattukamu2
質問者

お礼

ご回答誠にありがとうございました。  http://www.php.net/manual/ja/language.variables.scope.php  の中間あたりから、まだまだ、私の知識の範囲を超えた内容で、理解できません。  早く理解できるように、がんばります~~  

nattukamu2
質問者

補足

 分かりやすい、ULRのご紹介いただき、誠にありがとうございます。  暇ひま、読ませていただいたています。  解決には、しばらくお待ちくださいませ。

その他の回答 (3)

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.4

昔、BASIC言語にはグローバル変数しか存在しませんでした。 そのため以下のようなバグをよくやらかしたものです。 1. 処理αにて、変数Aに値を入れた 2. 処理βにて、一時的な作業用に変数Aを使った 3. 処理αにて、変数Aに基づく処理を行い、暴走した その後 C 言語のローカル変数という存在を知り、 また構造化プログラミングを覚えたため、 この手のバグからはオサラバできました。 と思ったら、大昔の業務用ソフトの保守をすることになり、 「このグローバル変数FLAG5を勝手に変更している奴はドイツだ!」 と笑えない冗談をかましながらチーム一丸となって 犯人探しに躍起になったことがあります。 その時は確か 怪しいCOBOLソースをラインプリンタで全部印刷して(ここまでで半日) 手分けして一行一行さがして(ここまでで二日) 候補をもちよって検討して(四日) 結局謎のままうやむやになった(五日) 悪いことは言いません。 プログラムの用途や規模に関係なく、グローバル変数は更新しちゃいけません。 もし万が一にも更新する必要があるならば、ソース内のコメントに ・処理の必要性を訴える理由 ・この決定にいたる詳細な経緯、できれば議事録をそのまま ・決定者の氏名と本人への確実な連絡手段 を記載する位の覚悟でお願いします。

nattukamu2
質問者

補足

ご回答誠にありがとうございます。  読ませていただきました。  大変貴重な体験談だと受け止めました。 かなり、勉強と参考になります。    今回は4件ものご回答を得て、多いので  解決にはもうしばらくお待ちくださいませ^^

noname#244856
noname#244856
回答No.3

$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)
回答No.1

他言語の人間ですが、内容を読むと、書かれた意味を「正確に」理解できない状態で使うと問題を生む機能のようです。 大半の場合、以下の内容で十分でしょう。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $GLOBALS 使うな。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

関連するQ&A

  • globalと$GLOBALSの違いは?

    globalと$GLOBALSの違いは、連想配列かそうでないかしかないのでしょうか。 大量に使う場合、どちらを使っても動作には差はでないでしょうか。 <?php $s = "グローバルスコープ"; //グローバルスコープ function scope_test0(){ echo $s; // 何も表示されない(ローカルスコープ) } scope_test0(); /* globalを使う */ $a = "スコープの違い"; function scope_test1(){ global $a; //ここでglobalを宣言、スコープが違う変数を参照可能に echo $a; //スコープの違い }; scope_test1(); /* $GLOBALSを使う */ $b = 3; $c = 4; function scope_test2(){ $GLOBALS["c"] = $GLOBALS["b"] + $GLOBALS["c"]; } scope_test2(); echo $c; //7 ?>

    • ベストアンサー
    • PHP
  • スコープについて

     PHPの変数スコープでは、global変数をglobalキーワードを使って、localに持ち込むことや、$GLOBALSを利用して呼び込むことができますが、local変数を関数の外(つまりglobal変数として)に持ち出すにはどうしたらよいのでしょうか? <? function example() { //なんらかの処理 $flag = 1; //なんらかの処理 } echo $flag; ?> これだと駄目なんですよね? returnで返す値にはその他のものが入っていて、一部のローカル変数のみを一時的にグローバル化したい…と思っています。  よろしくお願いします。

    • ベストアンサー
    • PHP
  • $GLOBALS変数について教えてださい

    $GLOBALS変数について教えてください。 $GLOBALS変数は、スーパーグローバル変数と認識しています。 スコープが違っても、データを保持できるようですが ページが遷移してもデータを保持できるのでしょうか? $_SESSIONと同じようにページ遷移してもデータを保持できますか? テストをしてみたのですが同ページ内ならデータを保有することは 確認できてます。ページ遷移するとデータが初期化されてしまっている 状態です。 ご存知の方いらっしゃったら教えてください。

    • 締切済み
    • PHP
  • register_globalや$$という変数について・・・

    PHPの勉強を始めて2週間足らずの初学者です。 質問させていただきます。 環境はwindowsXP+xampp+PHP5.2です。 現在、やや古めのPHP書籍のサンプルを試しています。 register_globals=Onの状態では、問題なく動作しました。 しかし、Offにすると反応しない部分があります。 test.phpにてsupport.phpをincludeしているのですが、 以下の箇所をそれぞれregister_globals=Off用に書き換える知恵が ありません。ほんの一部のみの抜粋にて恐縮ですがご査収願います。 ---「test.phpの一部」----------------------------------------- echo '<INPUT TYPE="radio" NAME="',$name,'"VALUE="',$kaitoubango,'">',"$val\n<br />";} ---「support.phpの一部」-------------------------------------- $kaitoubango++; $name = $kaitoubango; $val = $$name; -------------------------------------------------------------- 繰り返しになりますが、register_globals=Onの状態では、問題なく動作しましたが、Offでこの状態でフォームアクションしても$val = $$name;に値がありません。 「support.php」の$$nameを$_POST['name']に変更すれば、可能かと思いましたが、ダメでした。 なお、部分的な質問になりますが、 (1)「test.php」のNAME="',$name,'"VALUE="',$kaitoubango,'"ですが、 何故、NAME="$name" VALUE="$kaitoubango"でないのでしょうか? 「',」は何を意味しているのでしょうか? (2)「support.php」の$$nameという変数ですが、$が2つ連続した変数は今のところ、初めて見ました。これはどういう意味なのでしょうか? お詳しい方がおられましたら、何卒アドバイスのを頂戴できればと思います。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • regsiter_globalsがoffの場合の処理

    regsiter_globalsがoffの場合の 引数の渡し方と受け取り方を教えていただきたいです。 regsiter_globalsがonの場合は、 「http://****/test.php?test=1」 こんな感じでできたのですが、 offの場合はどのようにすれば良いのでしょうか? 参考になるページでも良いので、教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 変数を{}で囲むときに$を中に入れるか入れないか

    PHPで変数を書くとき、 echo $test; と書くのが普通ですが、前後に文字を書く場合は、 echo ああ{$test}いい; と書いていました。 が、最近になって、{}内に$を入れないのが普通ということを知りました。 そこで質問なんですが、$を{}内に入れた書き方は本当に間違いなのでしょうか? また、{}内に$を入れない場合は、$_GET['']を囲む場合はどのように囲めばいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの設定について

    よろしくお願いします。 先日、自宅サーバでアパッチとphpの4.3をインストールしました。 で、ローカルで試したところ、他は普通に動くのですが、変数を受け取りません。 たとえば <?php echo $test; ?> と記述したPHPをtest.phpとしてサーバフォルダにおき、 ブラウザでhttp://localhost/test.php?test=abc を見ても真っ白の画面になります。 同様に <form action="test.php" method="post"> (getでも試しました) <input type="text" name="test"> <input type="submit" value="送信"> </form> といったようにmethodで送っても真っ白な画面のままです。 次に test.phpを <?php if( $test == abc ){ echo "OK"; }else{ echo "NG"; } ?> とやってみて試しましたが結果はNGでした。 どうやら変数を受け取ってないらしいです。 phpのセキュリティを変更したらよいとの記事を見つけたのでそういう関係サイトを検索してみたのですが、それらしき内容を見つけられませんでした。 どなたかご教授お願いします。

    • 締切済み
    • PHP
  • URL変数が定義されているかどうか調べる

    PHPで、http://127.0.0.1/test.php?hensuu=Y というページをオープンした場合、 echo $hensuu; if (defined("hensuu")) { echo "Y"; } else { echo "N"; } 最初のecho文ではちゃんと"Y"を出力されるにもかかわらず、次のif文では"N"と出力されます。 URL変数が入力されたかどうかを確認するのにdefinedは使えないのでしょうか?

    • ベストアンサー
    • PHP
  • echoの直後に変数(文字列ではなく)を記述?

    echoの正しい記述方法についてご質問します。 echoの直後に変数(文字列ではなく)を記述する場合の質問です。この場合、echoを使用して「変数です」と出力(「」は、出力しません。)するには、以下の例の内、どの記述が正しい(又は最も良い)のでしょうか? 例1: <?php $var = "変数"; echo $var,'です'; ?> 例2: <?php $var = "変数"; echo ',$var,です'; ?> 例3: <?php $var = "変数"; echo '$var,です'; ?> また、上記よりもっと良い記述方法があれば、お教え下さい。 この質問の内容に関して詳細な情報が記載されているサイト等をご存知でしたら、お教え下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのincludeについて

    お世話になります。 Apache/2.2.3 PHP5.1.6 のレンタルサーバを利用しています。 httpdocs   |___lib   |  |___test.php   |___index.php という構造にしています。 -----test.php-------- <?php $a = 'sample'; ?> --------------------- -----index.php------- <?php include_once 'lib/test.php'; echo $a; ?> --------------------- 上記の場合、index.phpには 「sample」と表示されます。 -----index.php------- <?php include_once 'http://example.com/lib/test.php'; echo $a; ?> --------------------- 上記の場合、なぜか表示されません。 そこで「http://~~」はincludeできないのかなと思ったのですが -----test.php-------- <?php $a = 'sample'; echo $a; ?> --------------------- -----index.php------- <?php include_once 'http://example.com/lib/test.php'; ?> --------------------- とすると、なぜか「sample」と表示されました。 この結果から、includeはできているみたいです。 なんとか -----test.php-------- <?php $a = 'sample'; ?> --------------------- -----index.php------- <?php include_once 'http://example.com/lib/test.php'; echo $a; ?> --------------------- で「sample」と表示させたくて試行錯誤してみたのですが どうしても解決できません。 お力添えのほどお願いできればと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう