Amn378
@Amn378

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

グローバル変数のデータ保持範囲を正しく知りたい

Q&A

Closed

グローバル変数のデータ保持範囲について教えてください。

※PHP・Laravel初学者です。既存のシステムのお世話を担当することになり、この4月からコーディングを見ながら勉強しています。WEB系が初めてなので、まだ感覚もつかめていない状態です。

お世話になります。
スコープの概念はVBやVBA系で一応把握しているつもりです。

Laravelの構成も基本的に
route→Controller→Service(Model)→View
という流れで構成されていることも一応理解できたと思っています。

VBAを例に出すと
・Public宣言→同じModule内だけでなく外でも参照可
・Private宣言同じModule内のみ参照可
・Dim→プロシージャ内のみ参照可(PHPでいうところのローカル変数)
という形になると思いますが、PHP?Laravel?ではローカル変数以外のデータの持たせ方がまだ感覚的につかめていません。
VBAのように変数の宣言があるわけでもなく(PHPの場合、最初に値を入れるところを宣言というのでしょうか?)読んでいる既存のシステムのあらゆるところに $dataや$refなどあいまいな名称の変数が出てくるので、果たしてこれは同じ変数を表しているのか、それともスコープ違いの別変数なのか、というところを正しく認識できたらと思っています。

例えば TOP画面をHOMEとして
Home→ProjectA→ProjectA-A
Home→ProjectB→ProjectB-B
というリンクのあるWEBページがあり、どちらのProjectも同じトップ画面から遷移できるとします。
最初にProjectAのControllerで定義した変数$data にDBからの返却値を連想配列にしておくとします。
その後Homeに戻りProjectBのページを参照した場合、先の変数$dataの値は参照できると思ってもよいでしょうか?

よろしくお願いいたします。

0

2Answer

VBの場合、ボタンを押して取得したものは、グローバル領域の変数に格納して、次の画面操作の処理にそれを利用できます。Webの場合、上記類似する効果をしたい場合、1回目の操作のサーバ処理の結果をセッションの変数に格納して、次回の操作のサーバ処理に利用できます。

Webはrequestとresponseの概念が大事です。変数のスコープの概念はあくまで1回のリクエストとレスポンスの処理の中です。リクエストを越える情報共有は、セッションを使うかクッキーを使うか、もう変数のスコープで解決できません。

Webサーバは多数の操作者は同時操作を考慮しないといけないので、同じ画面の同じボタンは同時たくさんの人に押される可能性があります。大量且つ高速の処理を実現するため、明確の宣言がない限り、リクエストとレスポンスの処理が終わったら、処理中利用する変数は全部解放されます。そうしないとサーバメモリはすぐなくなるのです。その明確の宣言というのは、つまりその変数をセッションに設定することです。

2Like

Comments

  1. @Amn378

    Questioner

    @changkejun さん
    ご回答ありがとうございます。
    自分が感覚的にまだまだつかめていないなぁと実感いたしました。

    確かにおっしゃる通り、多数の方が一度に実行してもサーバーのメモリを食いつぶさないよう考慮するのは大切なことですね。
    つまり(複数回行っていて)一見冗長に見えるデータ取得処理もそれをセッションに設定(これはスーパーグローバル変数に入れるという意味合いでとらえましたが正しかったでしょうか?)してメモリを食いつぶすよりはキーだけ持っておいて再度問い合わせに行った方が賢い組み方といえるわけですね。
    そして、同じ$data という連想配列に入れていたとしても、(セッションに設定していなければ)それをパラメータとして渡していない限りは情報は引き継がれない、ということになりますね。
    前任担当者も素晴らしいプログラマなので、無駄なことはしているはずはないと思いながら、自分の知識とあまりにもかけ離れており、これは正しく知らなくてはのちに後悔すると思っての質問でした。
    ご教示大変ためになりました。
    また何かありましたらよろしくお願いいたします。

VB経験者にWEB系でのデータ保持範囲をわかりやすく言うと
WEBの各ページ phpなら 01.php 02.php や htmlごとに分けて作ると思いますが
その分けたページのそれぞれが1つの実行ファイルになっていると考えて下さい

ですので何もしなければ実行ファイル間のデータの受け渡しができないように
WEB系ではデータの受け渡しはできません

そのためにページを切り替える時に、どの変数を次のページへ持っていくのか?

というのをあらかじめ設計しておいて、データの受け渡しが出来るようにします
データの受け渡し方法はGET POST セッション クッキーなど色々あります

さらにWEB系の場合はデータがサーバー側にあるのか?クライアント側にあるのかも
ただしく理解しておく必要があります

まずは2つのPHPを含むページを設計して、最初のページに入力したものを次のページへ反映させるようなプログラムを組んでみてはいかがでしょうか?

0Like

Comments

  1. @Amn378

    Questioner

    @vram さん
    ご回答ありがとうございます。
    大変感覚的にわかりやすい表現でした。
    VBでは変数名にsDataとかsWkなど使っても、そのようなあいまいな名称は、ローカルの汎用的な変数などにしか使わないなぁと思っています。(基本どんなデータが入っているのか変数名でわかるようにしていると思います)

    しかしながらPhpStormで $dataをShiftボタン2回(なんでも検索というのでしょうか?)で検索するとあらゆるページに$dataが出てきてスコープの概念を正しく知らなくては、と思っての質問でした。
    大変ためになりました。
    ありがとうございました。

Your answer might help someone💌