PHP staticな変数とは?

このQ&Aのポイント
  • PHPでは、staticな変数を使用することができます。
  • staticな変数は、クラスや関数の外部で宣言された変数であり、その変数はグローバルスコープで共有されます。
  • staticな変数に値を格納すると、それはどの場所からでも参照することができます。
回答を見る
  • ベストアンサー

PHP staticな変数

phpでstaticな変数について教えてください。 ユーザの情報をstaticな変数に格納した際に、誰からでも参照できてしまうのでしょうか? 例えば今ログイン情報を格納するstatic変数があり、ログイン情報を取得してそのstatic変数に値を格納するstaticなメソッドがあるとします。このメソッドは、その変数にまだ値がない場合に、ログイン情報取得してそのあとその変数へ格納し、その変数にすでに値があった場合に、その変数の中身を返す仕様だとします。最初のユーザAがアクセスしてきてその変数にAの情報を格納します。ほぼどうじにユーザBがアクセスしてきた場合は、そのメソッドを呼んだ際に直前に格納されたAの情報が取れてしまうのでしょうか?それともそのstaticな変数にはまだ何もないのでしょうか?よく分かりません。私は間違って理解してしまってるのでしょうか?宜しくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

> 最初のユーザAがアクセスしてきてその変数にAの情報を格納します。ほぼどうじにユーザBがアクセスしてきた場合は、そのメソッドを呼んだ際に直前に格納されたAの情報が取れてしまうのでしょうか? AとBのアクセスは 別のプロセスですので、それぞれでメモリー空間は独立していますので たとえstatic変数であっても、変数を共有することはできません。 よって、否です。 もし、AとBで情報を共有したいなら、プロセスの終了と同時に開放してしまうPHPの変数ではなく、 DBやファイルを使う必要があります。

2015season
質問者

お礼

変数が共有できるのかと思ってしまっていました。ありがとうございます。

その他の回答 (1)

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.1

間違って理解しています。 なぜそんなサブルーチンみたいな考え方をしますか。 外から操作をされないためにstaticにするのですね。 staticというのはスコープ内のみ参照可ですね。 だとしたら、普通クラス内で定義しますね。 そのstaticなりソースはクラス内のメソッド以外では参照操作できないですね。 たとえばログインがあったとき初めてそのクラスのインスタンスを発生させ、それがセッションキープされますね。 ログアウトでdestroyされるんですね。 だとしたら、その変数にまだ値がない場合、なんていうことはありえませんね。 その変数自体がない場合、ということになり、インスタンスがない場合ですね。それを参照するのですか。あるいは書き込みに行くのですか。 そんなプログラミングをしたらバグです。 最初のユーザーAがアクセスしてきて別のユーザーBがアクセスしてくるなんていうことがありますか。 ユーザーAでインスタンスがひとつあり、ユーザーBで別のインスタンスがあるわけです。 同じリソースが見られたり操作できたりするわけないのじゃないですか。 そういうことをセッションというでしょう。 仮に共通で使いたいものがあるならDBに入れて、排他制御をしながら使うのではないでしょうか。 その場合でもクラス内のロジックですべて整合していないとおかしい。 もし複数のインスタンスから共通に見たり書き込めたりするならstaticではありえません。

2015season
質問者

お礼

ありがとうございます。

関連するQ&A

  • static 変数について

    static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }

  • staticのメリット、デメリット

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • static変数について

    struct XXX { char *aaa; char *bbb; }; static struct XXX YYY[] = { {NULL, "JJJ"}, ... }; thread(){ ... } 上記のstatic変数をスレッド関数thread()の外部変数として設定した場合、 *aaaの値はスレッドごとには確保することできませんでしょうか。 上書きされてしまうのでしょうか。 やはりスレッドセーフではないのでしょうか。 その際、どのように設定してあげればよいのでしょうか。 どなたかご教授お願いします。

  • ExcelのVBA。Staticな変数について

    あるプロシージャやfunctionで定義したstaticな変数は、その定義したsubやfunctionで有効です。今回、例えば、static a as integer とSub AAA 内で、定義し、その AAA が呼び出す BBB という ユーザーフォームの中でも staticな変数である a に値を代入したり、変更したりし、その後 sub AAAにまた入ったとき、BBBで変更した内容を保持することができるのでしょうか。

  • 【組込み】割り込み中のstatic変数について。

    ハード的な割り込みの入る可能性のあるシステムにおいて static変数を更新する間は割禁をかけるように指導されたのですが 理由がよく分かりません。 値が変えられる可能性があるとのことなのですが 少し詳しく教えていただけるとありがたいです。 (autoは平気でstaticはダメな理由、書き変わる際のシーケンス等) 以上、よろしくお願いします。

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • 関数内、ファイルのstatic変数

    関数内で、static変数を宣言した場合に、その値は保持されると 思いますが、その関数の外からポインタで見る場合にその値は 保証されるのでしょうか? (必ず同じメモリ上に配置されるのでしょうか?) また、関数とファイル内static変数においてスコープ以外に 取り扱いが変わったりするのでしょうか? (配置されるメモリ空間等) よろしくお願い致します。

  • java ローカル変数の値について

    素人ですが、どうぞ宜しくお願いします。 ローカル変数について教えてください。 リストビューでクリックされたアイテムをonItemClickメソッド内の変数に格納されているのですが、 通常スコープ外ではこの値は参照できないですよね? このようなローカル変数をスコープ外で参照する方法はあるのでしょうか? たとえば別のクラスや、別のメソッド内など。 ローカル変数の値を、メンバ変数に送るようなことって可能ですか? リストビューで選択された値を使いまわしたいのですが、 そんな方法がありましたら、ぜひご教授いただけないでしょうか? 宜しくお願いいたします!

    • ベストアンサー
    • Java
  • 分割ファイルでstatic変数はどのようにすれば良いのでしょうか?

    1つのファイルでstatic変数を使っている場合は気にしていなかったのですが、分割ファイルにした場合、static変数はどのようにすれば各ファイルで利用できるのでしょうか? 通常のグローバル変数の場合はexternとすれば良かったのですが方法がかわりません。 ** test1.cpp static int a; ** test2.cpp ?????? (二重定義になる) あと1ファイルから分割ファイルにした場合に気をつけるべき点など詳しい方教えて下さい。

  • 関数外からstatic変数を再度初期化できるのでしょうか?

    以下の静的変数?についてA,Bのメモリは別でしょうか? test関数外からBの変数を再度初期化できるのでしょうか? staticの仕組みがわからないのでstaticのメモリの初期化のタイミングとメモリアクセス方法について知りたいです。 static x = 1; // ---A int test() { static int x = 0; // --- B } またexternの働きも知りたいです。

専門家に質問してみよう