• ベストアンサー

スコープについて

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

  • Tinte
  • お礼率40% (40/98)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ん??exampleを実行しなければどうしようもないのでは? 普通にglobalにすればいいんじゃないですか? <? function example(){ global $flag ; $flag = 1; } example(); echo $flag; ?> あとは引数でリファレンス渡しするとか・・・ <? function example(&$flag){ $flag = 1; } example($flag); echo $flag; ?>

Tinte
質問者

お礼

 ありがとうございます! 「はじめてのPHP5(オライリー)」を片手に勉強中です。ここで質問するとスポットで解答して頂けてとてもありがたいです。  ローカルからグローバルにもglobalキーワードでOKだとは知りませんでした。テストしてみたら手堅く取り出せました!  ありがとうございます。  またリファレンスも非常に参考になりました!!

その他の回答 (1)

  • muchag
  • ベストアンサー率0% (0/2)
回答No.2

> local変数を関数の外(つまりglobal変数として)に持ち出すにはどうしたらよいのでしょうか? と > returnで返す値にはその他のものが入っていて、一部のローカル変数のみを一時的にグローバル化したい…と思っています。 から、Tinteさんは、 ・関数内で初めて定義した変数を関数外へ持ち出したい ・でも、return で戻せる変数は1つだから $flag は返せない と推測してみました。 これが合っているとすれば、こんな方法もあったと思います。 既に return にセットされている変数を $hoge とします。 <? function example() { //なんらかの処理 $flag = 1; //なんらかの処理 return array($hoge, $flag); } list($hoge, $flag) = example(); echo $flag; ?> (未検証、確かこういう記述だったと思います) list関数を使ってやることで、関数からの戻り値を複数に設定できるはずです。 yambejpさんへ PHPに「参照渡し」があるとは知りませんでした。 大変参考になりました。 ありがとうございました。

Tinte
質問者

お礼

ありがとうございます。 returnに配列を設定できるんですね。。。知らなかった…。 globalで渡す returnの配列で渡す この二つがあれば、かなり大量のデータも外に引っ張り出せるので充分です! とても参考になりました。ありがとうございます! (muchagさんのコードもきちんと動きました!)

関連する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
  • return の中はローカルスコープ?

    return 範囲内における、ローカル / グローバルスコープについて教えてください ■質問 ・returnするまではローカル変数? ・returnしたらグローバル変数? ・それとも、「return の中」というスコープは存在しない? ■例1 (function(){  return{   //ローカルスコープ?   //ここで定義した変数はローカル変数?  } })(); ■例2 (function(){  return{   hoge : (function(){    //ローカルスコープ?    //ここで定義した変数はローカル変数?   })()   }; })();

  • 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
  • スコープについて

    グローバル変数とポインタが定義されているファイル外でもスコープが適用となるのかどうかが判りません。 ローカル変数は関数内ですよね。 グローバル変数はどの関数内でも値を変えられる。ポインタも受け渡しをちゃんと行えば違う関数内の変数の値を変えられる。 これって異なるファイル間でも同じですか? (Aというファイルで定義されたグローバル変数やポインタがBというファイル内でも使えるのかどうか) よろしくお願いします

  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • PHP内でJavaScriptの処理は可能?

    PHP内変数 $flag をJavaScriptで参照し、条件処理を行っています。 JavaScriptの処理は onClick() のタイミングで行います。 ソースの概要は以下のようになります。 1.ログインしているか見る(flagでチェック、1はログイン中…) 2.flagのデータ取得、条件処理。 3-1. flagが1以外なら、true処理 3-2. flagが1なら、false処理  ・  ・ と、こんな処理を行いたいのですが…上手く出来ません。 ソースは以下になります。PHP側の変数 "$flag" までの取得は上手く出来たのですが、 JavaScript側の処理で、つまづいてます…。 で、表題にもあるようにPHP内でJavaScriptの処理は可能でしょうか? アルゴリズム的に、アドバイスなどありましたらご教授ください。 以下が主要部分のソースになります。 <?php echo("<script Language='JavaScript'> "+ "<!-- "+ "function check(){ "+ "if($flag != '1'){ "+ "return true; "+ "} "+ "else{ "+ "header('Location: ./error.html'); "+ "exit(); "+ "return false; "+ "} "+ "} "+ "//--> "+ "</script> "); echo(" <a href='test.html'><img src='botton.gif' onClick='check()' "> アドバイスお願い致します。

    • 締切済み
    • PHP
  • スコープ演算子について

    php素人です スコープ演算子についておしえてください 質問1 スコープ演算子を使えばclass内の変数を下記のような書き方で取得できますか? 質問2 スコープ演算子を使うとアロー演算子でオブジェクトを作成するよりプログラムの負荷の軽減になるのですか? 質問3 アロー演算子を使わずにスコープ演算子を使ったほうがいいのでしょうか? 質問4 スコープ演算子のデメリットはありますか? class Message { public $number=1; function hello() { return "こんにちは"; } } $number = Message::$number; $message1 = Message::hello(); よろしくお願いします

    • ベストアンサー
    • PHP
  • 関数スコープを抜けると初期化されてしまう

    小数点第X位で四捨五入する。使いまわす関数を作り複数の計算式で利用しようと思ったのですが変数roundNumの中身が関数が終了すると関数内の小数点第一位までという処理がなかったことになり、結局元の小数点をいくつでも出す状態に戻ってしまいます。 この理由は関数スコープがあるのでroundNumが同じ名前でも別変数になっているからでしょうか? それとも関数スコープを抜けた瞬間にこの除法は破棄されてしまうからでしょうか? このような処理をどうやって関数化しますか?関数化自体を諦めて同じコードをコピペしまくるしかないのでしょうか? var roundNum; (function () { function round(roundNum) { var decimalPoint = 1 ; roundNum = Math.floor( roundNum * Math.round( 10, decimalPoint ) ) / Math.round( 10, decimalPoint ) ; } ~

  • 関数から呼び出される別の関数でも同じ配列を使うには

    配列をグローバル変数化して、使おうとしています。 <?php $strMoji=array("a","b","c","d","e","f","g","h","i"); $result=fun_disp(2); function fun_disp($i){ global $strMoji; echo $strMoji[$i]; return true; } ?> とすれば、$strMoji[$i];には、c が入っていると表示されました。 ところが、 <?php $result=fun_example(8); function fun_example($j){ echo $j; $strMoji=array("a","b","c","d","e","f","g","h","i"); $result=fun_disp(2); } function fun_disp($i){ global $strMoji; echo $strMoji[$i]; return true; } ?> とすると、$strMoji[$i]; が表示されなくなりました。 やりたいことは、「ある関数内で使っている配列を、その中から呼び出される 別の関数でも使いたい」ということです。 しかし、方法が分からないでいます。どのように書けばいいのでしょうか? ※関数に、2を投げたり8を投げたりしていますが、この値は適当です。

    • ベストアンサー
    • PHP
  • 可変関数について。また、どこまで深く学ぶべきか

    phpを勉強しています。可変関数というものがあることを知り、試しに動かしてみました。 そのときに疑問になったことがあります。 可変関数は使わずに、関数内で変数に値を格納し直してreturnで値を戻せば同じことができるのでは?と思いやってみましたが変数に格納されている値が変わりませんでした。 この原因が分かれば教えて頂きたいです。 また、値渡ししたものは関数内で値を変えても影響がない、ということだけ知っていて、 その原因について詳しく知っていなくても問題はでないでしょうか。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>可変関数</title> </head> <body> <?php /*可変関数を使わない場合*/ function kahen_off_1($kf1) { $kf1 = "A<br>"; } function kahen_off_2($kf2) { $kf2 = "B<br>"; } $kahen_off = "default<br>"; echo $kahen_off; //default kahen_off_1($kahen_off); echo $kahen_off; //default kahen_off_2($kahen_off); echo $kahen_off; //default echo "<br>"; /*可変関数を使う場合*/ function kahen_on_1($kn1) { $kn1 = "A<br>"; } function kahen_on_2($kn2) { $kn2 = "B<br>"; } $kahen_on = "default<br>"; echo $kahen_on; //default kahen_on_1(&$kahen_on); echo $kahen_on; //A kahen_on_2(&$kahen_on); echo $kahen_on; //B echo "<br>"; /*returnでやる場合*/ function kahen_return_1($kr1) { $kr1 = "A<br>"; return $kr1; } function kahen_return_2($kr2) { $kr2 = "B<br>"; return $kr2; } $kahen_return = "default<br>"; echo $kahen_return; //default echo kahen_return_1($kahen_return); //default echo kahen_on_2($kahen_return); //default ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう