globalと$GLOBALSの違いは?

このQ&Aのポイント
  • グローバルスコープとローカルスコープの違いについて説明します
  • globalと$GLOBALSの違いは連想配列の使用有無です
  • 大量に使う場合、どちらを使っても動作には差はでないです
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

$GLOBALSはスーパーグローバル変数です(定義済みの変数()。 http://www.php.net/manual/ja/reserved.variables.globals.php globalキーワードは、あくまでもその関数内で使うその変数のスコープをグローバルにするというだけのものです(その変数自体がスクリプト全体に対してブローバルになるわけではありません)。 http://www.php.net/manual/ja/language.variables.scope.php

kiseki777
質問者

お礼

ありがとうございました。参考になりました。

関連するQ&A

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

     以下の意味ですが、わたし的(素人)には何を言いたいのか、物に例えると、輪郭程度でしたらわかります。  具体的に何を言いたいのでしょうか!?(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
  • $GLOBALS['b'] $GLOBALS['c

     以下ですが! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  サンプル1  <?php $a = 1; $b = 2; function Sum() { $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; } Sum(); echo $b; ?> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   以上ですが、 $GLOBALS['b']と echo $b;を  以下は、わたし(素人)、的に、$GLOBALS['c']と echo $c; に 変更しました。    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  サンプル2 <?php $a = 1; $b = 2; function Sum() { $GLOBALS['c'] = $GLOBALS['a'] + $GLOBALS['b']; } Sum(); echo $c; ?> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  以上ですが、これは、構文的には、間違っていないでしょうか!?  最初のプログラムと、同じ結果になるのでしょうか?       今までの、参考書にも”そこのところは”の解説があったのか!そもそも解説自体が  存在しなかったのか、定かではございませんが、読んだ記憶がございません?  以上よろしくお願いいたします。       考え方を模索中です。

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

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

    • ベストアンサー
    • PHP
  • どのようにすれば・・・。

    Funtion a()の値をFunction b()で使いたいのですがどのようにすればいいのでしょうか・・・? 具体的には以下のようにしたいと思っております。 HTMLを2ページ(page1、page2)と1つの外部Javascriptを使用。 page1でFunction a()で配列に数字を格納し、page2でFunction b()で処理を行う。 一番上でグローバル変数として配列を宣言し、 page1でFunction a()の処理を行い数字を配列に格納し、page2でFunction b()の処理を行おうと思いました。 しかし、page2でFunction b()を読み込むとき、グローバル変数として一番上で宣言したため、 再度宣言してしまうためか値が消えてしまい、できませんでした。 何か良い方法はありませんか・・・? よろしくお願いいたします。

  • Excel2003 VBA Functionの定数に関して教えて下さい

    Excel2003 VBA Functionの定数に関して教えて下さい。 例えば、 Function test(x, y) test = A * x + B * y + C End Function という数式を定義し、プログラム中で使用したいとします。 数式を見て分かる通り、xとyは変数でA, B, Cは定数です。 そして、これらA, B, Cの値を A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) のようにシート上の値を使用したいのですが、 上記のようにプログラム中で宣言してもFunctionの中では値が入っていないものとみなされてしまいます。 この問題の回避のため、、 Function test(x, y) A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) test = A * x + B * y + C End Function のようにFunctionの中に、定数を宣言を入れてしまうか、 Function test(x, y, A, B, C) test = A * x + B * y + C End Function のようにA, B, Cも定数ではなく、変数として扱う方法があります。 しかしながら、一つ目の方法では、こういったFunctionの数が増えてくると、 同じ定数を複数の場所で宣言することになり、後からプログラムを書き直そうとしたときに 極めて不便です。 一方で、2つめの方法では、test(x, y, A, B, C)のように、 一つのFunctionを呼び出すためにごちゃごちゃしてスペースをとり、 後から見たときに見にくくなります。 後、Constとして定義する方法もありますが、 A = Cells(3,5) のように、シート上のデータを代入する方法をとりたいと考えています。 上記以外の方法以外でもっとスマートな方法がありましたら 教えて頂けますでしょうか?

  • phpでオブジェクト化に挑戦中です。配列がうまく扱えません。

    このようなサンプルプログラムを作ってみました どうやら配列がまずいようなのですが、どうすればよいでしょうか。 <?php class TEST2{ var $b1; } class TEST{ var $a1=TEST2; function printout(){ $this->$a1[0]->b1='123 '; $this->$a1[1]->b1='abc '; $this->$a1[2]->b1='DEF '; } } $c = new TEST; $c->printout(); echo $c->$a1[0]->b1; echo $c->$a1[1]->b1; echo $c->$a1[2]->b1; ?> ちなみに出力結果は DEF DEF DEF となりました。 疑問1.なぜ全部同じ結果になるのか 疑問2.配列だと echo $c->$a1[2]->b1; のように、$a1と、$マークがないと動かない。$を取ると強制終了される。 お願いします。へんてこな質問ですみません。

    • 締切済み
    • PHP
  • for文で変数に格納される文字列 (Bシェル)

    シェルの記述に関しての質問です 例えば、 a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 ・ ・ ・ というスペース区切りの配列が書かれたリストファイル(test.lst)を for VAR in `cat test.lst` do set $VAR echo $1 echo $2 echo $3 done という形で処理しようとします。 そうすると、$VAR に入る変数は "a1" や "b1" といった感じで行単位ではなく、スペース区切りで入ってきてしまい、 $2 や $3 はnullになってしまいます。 これを行単位で $VAR という変数に代入する方法はありますか? 区切り文字はスペースのままとします。 宜しくお願いします。

  • 戻り値の型をそのまま制御したい

    久しぶりにPHP(5.3.28)をやってますが、あれ?ということが多くて困惑しています。 関数からの戻り値が配列の時、そのまま配列の要素にアクセスしようとすると アクセスすることができません。 一旦変数に保存することによって制御可能になるのですが、変数に保存する 必要がなく、立て続けに処理を記述したいと考えた場合にそれが行えません。 可能になる文法はあるのでしょうか? <?php function getArray() { return array("a", "b", "c", "d"); } // OK $a = getArray(); echo $a[0]; // NG echo getArray()[0];

    • ベストアンサー
    • PHP
  • [マクロ]配列を区切り文字で変数に格納する方法

    タイトルの通りなのですが、 例えば、 A1~B10にランダムな数字が入っています。 (1)A1~B10を配列Cに格納します。 (2)配列C(1,10)を変数test1に格納します。  ※その時に各配列を/で区切る (3)配列C(2,20)を変数test2に格納します。  ※その時に各配列を/で区切る (4)test1をセルC1に記入 (5)test2をセルC1に記入 のような感じです。 配列に格納する方法はさすがに分かるのですが、区切り文字を入れて変数に格納する方法が分かりません。。。。 ご教授お願いいたします。

  • 【VBScript】変数のスコープ

    変数のスコープについて詳しく教えて下さい。 どこで宣言すれば、どこまで有効か知りたい。 条件分岐やループ、ファンクション等でのスコープが分かりません。 特に、ファンクションの中のファンクションとかです。 参考サイトやヒントだけでも良いので教えて下さい。